2017-02-01 42 views
2

지금이 이상한 현상이 발생했습니다. ifstream을 사용하여 파일 내용으로 프로그램을 공급하고 들어오는 단어에 정규 표현식을 적용하면 독일 문자 ä ü ü가 나에게 약간의 어려움을 제공합니다. 이들 중 하나가 단어의 시작 부분에 나타나면, 정규 표현은 그 단어를 인식하지 못하지만,이 문자 중 하나라도 단어 내에 나타나지 않는다면 말입니다. 따라서이 줄은 문자열 검색에서 정규식을 찾지 못해서 작동하지 않습니다.독일어 Umlaute 및 정규식

string word = "über"; 
regex check {R"(\b)" + word + R"(\b)", regex_constants::icase}; 
string search = "Es war genau über ihm."; 

이 작동하지 않습니다. 그러나

string word = "für"; 
regex check {R"(\b)" + word + R"(\b)", regex_constants::icase}; 
string search = "Es war für ihn."; 

이 단어에 나타나기 때문에 작동합니다. 왜 그런데 어떻게 해결할 수 있습니까? 나는 모든 ü를 ue로 교체하고 모든 ä을 ae로 교체하고 나중에 모든 것을 oe로 교체하고 나중에 교체를 취소하는 것에 대해 생각해 보았습니다. 그러나 또 다른 가능성이 있습니까? Visual Studio 2015에서 작업하고 있습니다.

+1

문자 집합 문제입니까? 모든 것이 UTF-8 또는 다른 것입니까? – tadman

답변

1

대신 regex check {"(^|[\\x60\\x00-\\x2f\\x3a-\\x40\\x5b-\\x5e\\x7b-\\x7e])über($|[\\x60\\x00-\\x2f\\x3a-\\x40\\x5b-\\x5e\\x7b-\\x7e])", regex_constants::icase};을 사용하십시오.

C++ 정규 표현식의 기본 문법은 JavaScript와 비슷합니다. \b doesn't support Unicode.

And from microsoft.com :

워드 경계

경계는 다음과 같은 경우에 발생하는 단어 :

  • 현재 문자가 대상 시퀀스의 시작 부분과 중 하나입니다 단어 문자 A-Za-z0-9_.

  • 현재 문자 위치는 대상 시퀀스의 끝을 지나고 대상 시퀀스의 마지막 문자는 단어 문자 중 하나입니다.

  • 현재 문자는 단어 문자 중 하나이며 이전 문자는 아닙니다.

  • 현재 문자는 단어 문자 중 하나가 아니며 선행 문자는입니다.

+0

이 숫자의 의미는 무엇입니까? 그들은 캐릭터를 대변합니까? – AlexM

+0

@AlexM'[\\ x60 \\ x00 - \\ x2f \\ x3a - \\ x40 \\ x5b - \\ x5e \\ x7b - \\ x7e]'는'A-Za-z0- 9_'. 모든 일반적인 구두점과 일치합니다. – cshu

+0

@AlexM이 정규식은 'A-Za-z0-9_'와 같은 방식으로 모든 비 ASCII 문자를 고려합니다. 다른 유니 코드 구두점을 다른 문자와 같은 방식으로 처리합니다. 예 : '.'과'ü'도 같은 방식으로 취급됩니다. – cshu