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

7

我需要在C++的正则表达式中使用Unicode范围。基本上我需要一个可以接受所有有效Unicode字符的正则表达式。我尝试了测试表达式,但是遇到了一些问题。


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

这个问题是否与\\u有关?

删除 \\u0080-\\uDB7F 并尝试匹配 124。如果匹配,那么问题就在 \\u0080-\\uDB7F 上。 - Wiktor Stribiżew
问题在于C++没有可用的Unicode支持。可以使用类似ICU的东西。 - Baum mit Augen
或者Boost也是一个不错的选择。顺便说一下,查看这个UnicodeEscapeSequence是字母u后面紧跟着四个HexDigits。这个字符转义匹配的是其代码单元等于这个四位十六进制数的数字值的字符。如果该值不适合此std::basic_regexCharT,则会抛出std::regex_error(仅限C++)。 - Wiktor Stribiżew
@WiktorStribiżew uDB7F和大部分之前的内容肯定不适合用char - Baum mit Augen
1
@BaummitAugen:这也许是wregex可以帮助的原因。我现在没有时间检查。 - Wiktor Stribiżew
基本上我需要一个正则表达式来接受所有有效的Unicode字符。问题中提供的表达式只是一个测试正则表达式。我会相应修改问题。 - vijin
1个回答

7
这应该可以正常工作,但需要使用 std::wregexstd::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转换库,我在上面的例子中使用了这个

编辑: 或者,你可以使用此答案中提供的函数:

有没有适用于C++字符串码点和码单元的好解决方案?


非常好的答案,谢谢! [\\u0080-\\uDB7F]+ 范围包括什么? A-Z?在这方面,[a-zA-Z0-9] 的正则表达式是什么? - SexyBeast
1
@SexyBeast 我只是从原始贴中复制了该范围。但您可以在此处查看它所涵盖的内容:http://www.idevelopment.info/data/Programming/character_encodings/PROGRAMMING_character_encodings.shtml 此外,您编写的内容在正则表达式中应该可以正常工作。 - Galik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接