我现在遇到了这种奇怪的现象。如果我使用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和每个ä用oe替换每个ü,然后用oe取代每个ü,然后取消替换,但还有另一种可能性吗?我正在使用Visual Studio 2015。
答案 0 :(得分: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
Word Boundary
在以下情况下会出现字边界:
当前字符位于目标序列的开头,是字符A-Za-z0-9 _之一。
当前字符位置超过目标序列的末尾,目标序列中的最后一个字符是其中一个 字符。
当前字符是单词字符之一,前面的字符不是。
当前字符不是单词字符之一,前面的字符是。