我需要在C++的正则表达式中使用Unicode范围。基本上我需要一个可以接受所有有效Unicode字符的正则表达式。我尝试了测试表达式,但是遇到了一些问题。
std::regex reg("^[\\u0080-\\uDB7Fa-z0-9!#$%&'*+/=?^_`{|}~-]+$");
这个问题是否与
\\u
有关?std::wregex
和 std::wsmatch
。您需要将源字符串和正则表达式转换为宽字符Unicode(在Linux上是UTF-32,在Windows上是UTF-16(ish)),以使其正常工作。
如果源文本为UTF-8
,那么这对我有效:
inline std::wstring from_utf8(const std::string& utf8)
{
// code to convert from utf8 to utf32/utf16
}
inline std::string to_utf8(const std::wstring& ws)
{
// code to convert from utf32/utf16 to utf8
}
int main()
{
std::string test = "john.doe@神谕.com"; // utf8
std::string expr = "[\\u0080-\\uDB7F]+"; // utf8
std::wstring wtest = from_utf8(test);
std::wstring wexpr = from_utf8(expr);
std::wregex we(wexpr);
std::wsmatch wm;
if(std::regex_search(wtest, wm, we))
{
std::cout << to_utf8(wm.str(0)) << '\n';
}
}
输出:
神谕
注意: 如果你需要一个UTF转换库,我在上面的例子中使用了这个。
编辑: 或者,你可以使用此答案中提供的函数:
[\\u0080-\\uDB7F]+
范围包括什么? A-Z
?在这方面,[a-zA-Z0-9]
的正则表达式是什么? - SexyBeast
\\u0080-\\uDB7F
并尝试匹配124
。如果匹配,那么问题就在\\u0080-\\uDB7F
上。 - Wiktor Stribiżewu
后面紧跟着四个HexDigits。这个字符转义匹配的是其代码单元等于这个四位十六进制数的数字值的字符。如果该值不适合此std::basic_regex
的CharT,则会抛出std::regex_error
(仅限C++)。 - Wiktor Stribiżewchar
。 - Baum mit Augenwregex
可以帮助的原因。我现在没有时间检查。 - Wiktor Stribiżew