【问题标题】:Regex unicode chars in C++C ++中的正则表达式unicode字符
【发布时间】:2020-11-12 13:17:05
【问题描述】:

我的配置文件(例如,.ini 文件)的以下部分已损坏,我正在开发一个 C++ 应用程序,该应用程序使用正则表达式检测文件损坏,检测配置文件中的无效字符:

当我通过使用 istream 并存储到字符串(示例)中读取此文件时,我在 myexpr 处的正则表达式实现存在问题,不知何故未检测到文件损坏。在这段代码中,我预先存储了读取的文件内容。

TEST(Concept, RegexUnicode1Sample)
{
    regex myexpr (R"(/[^\u0020-\u007E]|(\b.*(Mensagem|Antes|Loop|Movimentar|\|).*)|\\[0-9]{3,4}/g)");

    string sample = R"(\025\003\003\000\032\347\061\f\002\002\207\351H\346\353\037B\341\177\250\264\202\004\236\227\265
                    \261;\227\346ocolPortSecure=0\nMultiProtocolPort=0\n\n[TCP]\nTYPE=TCPIP\nPort=6800\n\n)";

    bool status = regex_match(sample,myexpr);
    EXPECT_TRUE(status);
}

这个单元测试在我运行时失败了,这里可能有什么问题?我在https://regexr.com/ 测试了我的正则表达式,它可以检测到损坏的字符。

【问题讨论】:

    标签: c++ regex unicode


    【解决方案1】:

    您在正则表达式中使用了 Perl /.../g 语法。 C++ 不支持。

    相反,只包括斜线之间的模式。然后,全局搜索使用std::regex_search:

    std::regex myexpr (R"([^\u0020-\u007E]|(\b.*(Mensagem|Antes|Loop|Movimentar|\|).*)|\\[0-9]{3,4})");
    std::string sample = R"(\025\003\003\000\032\347\061\f\002\002\207\351H\346\353\037B\341\177\250\264\202\004\236\227\265
                        \261;\227\346ocolPortSecure=0\nMultiProtocolPort=0\n\n[TCP]\nTYPE=TCPIP\nPort=6800\n\n)";
    bool status = std::regex_search(sample, myexpr);
    

    演示:https://godbolt.org/z/5n51z3

    不过,需要注意的是,C++ 标准库实现中对 Unicode 的支持状态非常差。如果您需要匹配非 ascii 字符,您可以考虑使用开箱即用支持 UTF-8 的第 3 方库。

    【讨论】:

    • 现在看来 100% 有效。感谢您的帮助。我还听说 STL 正则表达式在某些情况下有些错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2010-09-26
    • 1970-01-01
    • 2021-10-16
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    相关资源
    最近更新 更多