提问人:vijin 提问时间:6/23/2016 最后编辑:vijin 更新时间:1/17/2018 访问量:9326
如何在 C++ 正则表达式中使用 Unicode 范围
How to use Unicode range in C++ regex
问:
我必须在 C++ 的正则表达式中使用 unicode 范围。基本上,我需要的是有一个正则表达式来接受所有有效的unicode字符。我只是尝试使用测试表达式并遇到一些问题。
std::regex reg("^[\\u0080-\\uDB7Fa-z0-9!#$%&'*+/=?^_`{|}~-]+$");
问题出在?\\u
答:
7赞
Galik
6/23/2016
#1
这应该可以正常工作,但您需要使用 和 .您需要将源字符串和正则表达式转换为宽字符 unicode(Linux 上的 UTF-32,Windows 上的 UTF-16(ish)))才能使其正常工作。std::wregex
std::wsmatch
这对我有用,源文本是: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
编辑:或者,您可以使用此答案中给出的函数:
评论
0赞
NedStarkOfWinterfell
1/17/2018
很好的答案,谢谢!范围涵盖哪些内容? ?在这种情况下,正则表达式是什么?[\\u0080-\\uDB7F]+
A-Z
[a-zA-Z0-9]
1赞
Galik
1/17/2018
@SexyBeast我只是从 OP 问题中复制了该范围。但你可以在这里看到它所涵盖的内容:idevelopment.info/data/Programming/character_encodings/......此外,您编写的内容在正则表达式中应该可以正常工作。
评论
\\u0080-\\uDB7F
124
\\u0080-\\uDB7F
u
std::basic_regex
std::regex_error
char
wregex