2012-11-05 2 views
2

C++ 11 정규 표현식을 사용하여 중괄호 일치 내용을 추출하고 싶다고 가정 해 보겠습니다. 예를 들어, {foo}이 성공적으로 일치하고 내용을 추출하려면 match_result을 사용할 수 있습니다. 그것은 간단 보이지만, 다음 코드는 매우 내가C++ 정규 표현식 중괄호 안의 내용 일치

std::string foo("{foo}"); 
std::regex r("\\{(.*)\\}"); 
std::smatch m; 
bool result = regex_match(foo, m, r); // result returns true 

cout << m[0] << endl; // prints: {foo} 
cout << m[1] << endl; // prints: {foo} instead of just foo as I would expect 

지금 중괄호가 첫 번째 캡처 그룹이라고 m[1] 수익을 제공하지 말아야 단지 foo없이 할 일을하지 않는 이유는 무엇입니까?

EDIT :이 질문에 대한 필수 정보는 GCC 4.6.3 (현재 Ubuntu 12.04 LTS의 최신 저장소 버전)입니다. 그 답은 GCC에서 정규 표현식에 대한 지원이 얼마나 열악한지를 정확하게 나타냅니다.

+0

참고. – inf

+1

컴파일러/표준 라이브러리? gcc/libstdC++를 포함한 대부분의 컴파일러/표준 라이브러리는 정규식 지원을 완전히 구현하지 못했습니다. – Artyom

답변

3

정확한 패턴입니다. 귀하의 코드는 'std'가 여기 저기에 ('cout', 'endl'및 regex_match) 누락되거나 적어도 일치하지 않는 경우 ('네임 스페이스 표준을 사용한다고 가정 할 때) 거의 대부분 맞습니다.

또한 Visual Studio 2012에서 코드 결과가 예상대로 출력됩니다. 나는 2010 년을 시도하지 않았지만 2010 년에 TR1을 다시 통합했습니다.

gcc를 사용하고있는 것으로 의심됩니다. @Artyom이 지적했듯이 gcc/libstdC++는 구현되지 않았습니다. 그것은 경고없이 잘 컴파일되지만 잘못된 결과를줍니다. gcc가 모든 영역에서 Microsoft보다 우월하다는 공통된 믿음에도 불구하고 정규 표현식에서는 그렇지 않습니다. 여기 GCC에 정규식의

찾기 상태 : 당신은 대부분 모든 정규 표현식 물건이 아직 구현되지 않은, gcc의 사용자 인 경우 http://gcc.gnu.org/onlinedocs/libstdc++/manual/status.html#status.iso.200x

+0

당신은 틀린입니다. GCC는 여전히'std :: regex'를 지원하지 않습니다. 이 경우에 모든 것이 오류없이 컴파일된다는 것은 불행한 일입니다. 지금은 정규식을 높이기 위해 전환해야한다고 생각합니다. –

+0

Microsoft는 2008 년에 TR1을 VC++ 2008 SP1의 기능 팩 선구자로 추가했습니다 (이후이 서비스 팩에 통합 됨). – ildjarn

+0

5 년 계층 g ++ v4.8은 장래에 장기 지원을 제공하는 우분투 14의 기본 g ++ 버전입니다. 그리고, 분명히, 정규식 컴파일하지만 작동하지 않습니다. 아하. v4.8 정규식 지원 제한에 대한 자세한 내용은 https://stackoverflow.com/a/12665408/2950621을 참조하십시오. – nmgeek