2010-03-02 3 views
1

tr1 :: regex (VS2008)에 대해 아주 이상한 문제가있어서 그 이유를 알 수 없습니다.정규 표현식 패턴 (tr1 :: regex)에서 예외가 발생하는 이유는 무엇입니까?

마이크로 소프트 C++ 예외 : 실행 중 4 번째 정규 표현식 정의에 도달 할 때 게시물의 끝에있는 코드는 예외를 잘 컴파일하지만 슬로우 표준 : TR1 :: regex_error 메모리 위치 0x0012f5f4에서 ..

그러나 3 번과 4 번 사이에 볼 수있는 유일한 차이점은 'SchemeVersion'대신 'NumberOfComponents'입니다. 처음에는 둘 다 (세 번째와 네 번째) 잘못 생각하고 세 번째 오류는 네 번째에서 방아쇠를 당겼을 것이라고 생각했습니다. 그건 둘 다 주위에 이동하고 그들 사이에 여러 다른 정규식 정의를 넣어로 사건이되지 않는 것 같습니다. 문제의 행 은 항상입니다.

사람은 그 라인

std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}");

는 예외지만

std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}");

을하지 않는 트리거 왜 어떤 생각을 가지고 있습니까? 런타임이 나를 혼란 스럽습니까?

시간을내어 읽고 통찰력을 얻었습니다.
T

PS : 나는 ... 해결책 내가 '바보 같은 질문'카르마을 균일하게하기 위해 가까운 벽에 머리를 쳐야 쉽습니다 완전히 확신


#include <regex> 

int main(void) 
{ 
    std::tr1::regex rxSepFileIdent("Scanner Separation Configuration"); 
    std::tr1::regex rxScannerNameIdent("\\ScannerName:((\\s*\\w+)+)"); 

    std::tr1::regex rxSchemeVersion("\\SchemeVersion:(\\s*\\d+){1}"); 
    std::tr1::regex rxNumberOfComponents("\\NumberOfComponents:(\\s*\\d+){1}"); 

    std::tr1::regex rxConfigStartIdent("Configuration Start"); 
    std::tr1::regex rxConfigEndIdent("Configuration End"); 

    return 0; 
} 
+0

"NumberOfComponents"라고 말하도록 rxSchemeVersion 행을 변경하면 어떻게됩니까? –

+0

'std :: tr1 :: regex_error'는 다소 일반적인 것입니다. 에러 코드 란 무엇입니까 (예외를 (예)'rerr'로 잡고'rerr.code()'를 출력합니까?)? 그 결과를'std :: tr1 :: regex_constants :: error_type' 상수 (http://msdn.microsoft.com/en-us/library/bb982845(lightweight).aspx)와 비교하여 어떤 에러 (들) 너는 상대하고있어. – outis

답변

2

당신이 필요 한 번 정규식 자체에 대해 문자열을 두 번 다시 입력하십시오.

\S이 유효한 정규식 이스케이프 (공백이 아닌 문자)이기 때문에 S로 시작하는 문자가 작동합니다. N으로 시작하는 것은 유효하지 않습니다 (왜냐하면 \N은 유효한 정규식 이스케이프가 아니기 때문입니다).

대신 "\\\\SchemeVersion: 등을 사용하십시오.

+0

답장을 보내 주신 모든 분들께 고맙습니다. (특히 Dav와 Vlad) ... 지금 내 구획에 움푹 들어간 곳을 물어 보겠습니다. : D – Tobias