2017-04-06 5 views
-2
#include <regex> 
#include <string> 
#include <iostream> 

using namespace std; 

bool IsMatched() 
{ 
    string str = R"(Liy_0-3863)"; 
    string re = R"([:\-_a-zA-Z\d]+)"; 

    auto flags = std::regex_constants::ECMAScript; 
    return std::regex_match(str.data(), 
     std::regex(re.data(), re.size(), flags)); 
} 

int main() 
{ 
    cout << boolalpha << IsMatched(); 
} 
  • 연타 4.0 출력 true;
  • gcc 6.2 출력 false.

누구의 버그입니까? clang 또는 gcc?누구의 버그입니까? clang 또는 gcc?

+4

GCC 트렁크는'true'를 출력하므로 그 대답은 명백하다고 생각합니다. –

+5

질문 제목은 오해의 소지가 있습니다. 이 질문은 검색을 통해 찾을 수 없습니다. 제목을 더 잘 설명하여 키워드에 정규식을 추가하십시오. –

+0

@ Ryan이 사진이 이쪽 \ - –

답변

4

g ++ (또는 stdlibC++) 오류입니다.

ECMAScript 사양에 따르면 이스케이프 처리 된 빼기 문자는 문자 클래스 내에서 문자 그대로 처리해야합니다. libstdC++가 실패합니다. 더 간단한 예제에서 볼 수 있습니다.

string: a-b 
    regex: [a\-b]+ 

gcc는 일치하지 않는다고 말하면서 다양한 정규식 테스터가 있다고 말합니다.