如何在 C++ 正则表达式中使用 Unicode 范围

How to use Unicode range in C++ regex

提问人:vijin 提问时间:6/23/2016 最后编辑:vijin 更新时间:1/17/2018 访问量:9326

问:

我必须在 C++ 的正则表达式中使用 unicode 范围。基本上,我需要的是有一个正则表达式来接受所有有效的unicode字符。我只是尝试使用测试表达式并遇到一些问题。


std::regex reg("^[\\u0080-\\uDB7Fa-z0-9!#$%&'*+/=?^_`{|}~-]+$");

问题出在?\\u

C++ 正则表达式

评论

0赞 Wiktor Stribiżew 6/23/2016
删除并尝试匹配 。如果匹配,是的,问题出在 .\\u0080-\\uDB7F124\\u0080-\\uDB7F
0赞 Baum mit Augen 6/23/2016
问题是 C++ 没有可用的 Unicode 支持。使用类似 ICU 的东西。
0赞 Wiktor Stribiżew 6/23/2016
或者 Boost 也是一个不错的选择。顺便说一句,检查一下UnicodeEscapeSequence 是字母后跟四个十六进制数字。此字符转义符与其代码单位等于此四位十六进制数的数值的字符匹配。如果该值不适合此 的 CharT,则抛出(仅限 C++)。ustd::basic_regexstd::regex_error
0赞 Baum mit Augen 6/23/2016
@WiktorStribiżew uDB7F 和之前的大多数东西肯定不适合 .char
1赞 Wiktor Stribiżew 6/23/2016
@BaummitAugen:这就是为什么也许会有所帮助。我现在没有时间检查wregex

答:

7赞 Galik 6/23/2016 #1

这应该可以正常工作,但您需要使用 和 .您需要将源字符串和正则表达式转换为字符 unicode(Linux 上的 UTF-32,Windows 上的 UTF-16(ish)))才能使其正常工作。std::wregexstd::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

编辑:或者,您可以使用此答案中给出的函数:

C++ 字符串代码点和代码单元有什么好的解决方案吗?

评论

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/......此外,您编写的内容在正则表达式中应该可以正常工作。