2016-08-21 2 views
0

그래서 내가 가지고 표준 : : 문자열에 다음 텍스트 :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를 : 교류 '다음 정규식을 사용 : 내가 갈거야 어디

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

이름은 반드시 조각 [1]이어야하고 주소는 조각 [2]'이어야합니다. 'pieces [0]'는 전체 regexp와 일치합니다. – 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

고마워! 이 일을, 지금은 이해가 :) –