Я столкнулся с этим странным явлением суровых времен сейчас. Если я использую ifstream для подачи программы с содержимым файла и применяю регулярное выражение к входящим словам, немецкие буквы ä ö ü доставляют мне некоторые трудности. Если какой-либо из них появляется в начале слова, регулярное выражение не может их распознать, но не в том случае, если в слове присутствует какая-либо из этих букв. Итак, эти строки
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 и каждого ö на oe, а затем отменил замену, но есть ли еще одна возможность? Я работаю с Visual Studio 2015.
использование 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 ++ regex похожа на JavaScript. \b
не поддерживает Unicode.
Слово Граница
Граница слова встречается в следующих ситуациях:
Текущий символ находится в начале целевой последовательности и является одним из символов слова A-Za-z0-9_.
Текущая позиция символа находится за концом целевой последовательности, а последний символ в целевой последовательности является одним из
слово символы.Текущий символ является одним из символов слова, а предыдущий символ — нет.
Текущий символ не является одним из символов слова, а предыдущий символ является.
Других решений пока нет …