2017-02-01 12 views
2

Я столкнулся с этим странным явлением суровых времен. Если я использую ifstream для подачи программы с содержимым файла и применяю регулярное выражение к входящим словам, немецкие буквы ä ö ü предоставляют мне некоторые трудности. Если какой-либо из них появляется в начале слова, регулярное выражение не может распознать их, но не в том случае, если какое-либо из этих букв появляется внутри слова. Таким образом, эти строкиНемецкие Umlaute и регулярные выражения

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

не работает, потому что регулярное выражение не находит über в поиске строк. Однако

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

будет работать, потому что ü появляется в слове. Почему это и как я могу это исправить? Я подумал о замене каждого ü на ue и каждого ä ae и каждого ö by 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:

Слово Boundary

слово граница возникает в следующих ситуациях:

  • Текущий символ в начале последовательности-мишени и один из текстовые символы A-Za-z0-9_.

  • Текущее положение символа проходит через конец целевой последовательности, а последний символ в целевой последовательности является одним из символов слова .

  • Текущий символ является одним из символов слова, а предыдущий символ - нет.

  • Текущий символ не является символом слова и предшествующим символом.

+0

В чем смысл этих чисел? Они стоят за персонажей? – AlexM

+0

@AlexM '[\\ x60 \\ x00 - \\ x2f \\ x3a - \\ x40 \\ x5b - \\ x5e \\ x7b - \\ x7e]' означает любой символ ascii, кроме 'A-Za-z0- 9_'. Он соответствует всем обычным знакам препинания. – cshu

+0

@AlexM Обратите внимание, что это регулярное выражение рассматривает все символы без символов ascii так же, как 'A-Za-z0-9_'. Он будет обрабатывать специальную пунктуацию в unicode так же, как и другие буквы. например '.' и' ü' обрабатываются одинаково. – cshu