2016-08-21 125 views
0

所以我有一个的std :: string以下文字:C++的正则表达式匹配,不匹配

2: enp1s0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000\ link/ether 68:f7:28:4e:7b:ac brd ff:ff:ff:ff:ff:ff 

,我试图提取 'enp1s0' 和'68:F7:28:4E:7B :AC”使用下面的正则表达式:

\d{1}:\s+(\w+).*link\/ether\s{1}([a-z0-9:]+) 

其在网上正则表达式测试仪的工作原理,但是这个C++代码未检测到匹配:我要去哪里

std::regex interface_address("^\\d{1}:\\s+(\\w+).*link\\/ether\\s{1}([a-z0-9:]+)"); 
std::smatch pieces; 
if (std::regex_match(line, pieces, interface_address)) { 
    std::string name = ""; 
    std::string address = ""; 
    for (size_t i = 0; i < pieces.size(); ++i) { 
     auto submatch = pieces[i]; 
     if (i == 0) { 
      name = submatch.str(); 
     } else if (i == 1) { 
      address = submatch.str(); 
     } 
    } 
    std::cout << name << address << std::endl; 
} 

错误?

+0

仅供参考,在正则表达式中没有任何理由给“{1}”。这是任何模式的默认值。 – Barmar

+0

你的编译器是什么?并非所有编译器都支持'regex'井 –

+0

请注意,该名称应该位于'pieces [1]'中,地址位于'pieces [2]'中。 'pieces [0]'是整个正则表达式的匹配。 – Barmar

回答

1

当字符串不匹配模式时,regex_match失败。请注意,该字符串的brd ff:ff:ff:ff:ff:ff部分未被匹配。所有你需要做的,那么,是追加*的模式:

^\\d{1}:\\s+(\\w+).*?link\\/ether\\s{1}([a-z0-9:]+).* 

此外,对于例如,环心不是必要的。您可以使用:

if (std::regex_match(line, pieces, interface_address)) { 
    std::string name = pieces[1]; 
    std::string address = pieces[2]; 
    std::cout << name << address << std::endl; 
} 
+0

谢谢!这工作,现在我明白了:) –