2016-08-21 14 views
0

だから私持っているのstd ::文字列に次のテキスト: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」は、次の正規表現を使用して:私はつもりどこ

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; 
} 

:オンライン正規表現テスターで動作しますが、このC++コードが一致を検出しません

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

違う?

+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

ありがとう!これはうまくいって、今私は理解する:) –