C++ 中的正则表达式 unicode 字符
Regex unicode chars in C++
我的配置文件(例如 .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"(5[=10=]3[=10=]3[=10=]0271\f[=10=]2[=10=]271H637B17042[=10=]4675
1;76ocolPortSecure=0\nMultiProtocolPort=0\n\n[TCP]\nTYPE=TCPIP\nPort=6800\n\n)";
bool status = regex_match(sample,myexpr);
EXPECT_TRUE(status);
}
当我 运行 时此单元测试失败,这里可能有什么问题?我在 https://regexr.com/ 测试了我的正则表达式,它可以检测到损坏的字符。
您在正则表达式中使用了 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"(5[=10=]3[=10=]3[=10=]0271\f[=10=]2[=10=]271H637B17042[=10=]4675
1;76ocolPortSecure=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 的第三方库。
我的配置文件(例如 .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"(5[=10=]3[=10=]3[=10=]0271\f[=10=]2[=10=]271H637B17042[=10=]4675
1;76ocolPortSecure=0\nMultiProtocolPort=0\n\n[TCP]\nTYPE=TCPIP\nPort=6800\n\n)";
bool status = regex_match(sample,myexpr);
EXPECT_TRUE(status);
}
当我 运行 时此单元测试失败,这里可能有什么问题?我在 https://regexr.com/ 测试了我的正则表达式,它可以检测到损坏的字符。
您在正则表达式中使用了 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"(5[=10=]3[=10=]3[=10=]0271\f[=10=]2[=10=]271H637B17042[=10=]4675
1;76ocolPortSecure=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 的第三方库。