2012-04-09 2 views
4

다음 코드가 "일치하지 않음"을 인쇄하는 이유는 무엇입니까? 컴파일러 또는 라이브러리 버전과 관련된 것이 있습니까? 나는 g ++ a.cpp로 컴파일했다.tr1/regex 문제가 있습니다. 반대 결과를 인쇄하십시오

#include <tr1/regex> 
#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    const std::tr1::regex pattern("(\\w+day)"); 

    std::string weekend = "Saturday and Sunday"; 

    std::tr1::smatch result; 

    bool match = std::tr1::regex_search(weekend, result, pattern); 

    if(match) 
    { 
     for(size_t i = 1; i < result.size(); ++i) 
     { 
     std::cout << result[i] << std::endl; 
     } 
    }else 
    std::cout << "no match" << std::endl; 

    return 0; 
} 
+0

짧은 완성 테스트 케이스의 경우 +1. –

+0

코드가 너무 명확하여 표준을 향해 (적어도 내 버전에서는) 컴파일러의 불완전한 지원을 의심하고 있습니다. 어떻게 확인할 수 있습니까? – cateof

+0

참조 용 - MSVC 2010 SP1 (16.00.40219.01)은 일치 항목을 올바르게 컴파일하고 찾습니다. 사용중인 GCC의 버전을 지정하지 않았습니다. – DCoder

답변

0

문제로 결과를 얻을 것입니다. 나는 <boost/regex.hpp>에 대해 <tr1/regex>을 스왑 아웃하는 것이 좋습니다 (Linux를 사용 중이므로 특히 편리합니다). 네임 스페이스는 std::tr1:: 대신 boost::이되지만 다른 모든 구문은 정확히 동일하며 모든 문제를 해결할 수 있습니다.

부스트를 사용할 수 없다면 완전히 다른 이야기입니다. 그러나 지난 1 년 정도면 대부분의 사람들/고용주/회사가 훨씬 더 우호적이었습니다.

테스트 케이스에 결함이 있습니다. 루프가 있지만 단일 값만 인쇄합니다. regex_search은 한 번에 하나의 값을 반환하므로 모든 결과를 얻으려면 새 검색 시작 인덱스로 계속 호출해야합니다. 프로그램의 출력이 아무 것도 없다고 말하면 (vs "no match") 버그가 코드에 있다고합니다. 그러나 코드 은 현재으로 작성되어 있으므로 "Saturday" 또는 ""을 반환해야합니다.

0

()을 (를) 이스케이프 해 보셨습니까? 일부 정규식 구현에서는 그룹화에 \(을 사용해야합니다. 그리고 어쨌든 당신은 아마 그것을 필요로하지 않습니다.

이에 대한 가장 기본적인 정규 표현식은 다음과 같습니다

"[a-zA-Z]+day" 

그리고 당신은 당신의 컴파일러로 확실히 result[0]

+0

"일치 없음". 컴파일러 prob를 찾습니다. – cateof

관련 문제