首页 > 解决方案 > Google RE2 无法识别正则表达式中的 Unicode 转义

问题描述

我正在使用 C++ 开发一个应用程序,该应用程序使用 Google RE2 库使用正则表达式验证配置文件。配置文件的内容被读入一个 std::string;

到目前为止,我声明了这个包含正则表达式的字符串:

const string EXPR_FAILED_FILE(R"([^\u0020-\u007E\n]|(\b.*(Mensagem|Antes|Loop|Movimentar|\|).*)|\\[0-9]{3,4})");

但是,在下面的这个实现中,我在检测测试字符串(strInput)中的一些无效字符时遇到了一些问题

bool checkStringConsistency(const string& strInput){
    RE2 re(EXPR_FAILED_FILE);
    bool b_matches = RE2::FullMatch(strInput, re);
    return b_matches;
}

当我运行代码时,我在 stderr 中收到这些消息:

re2/re2.cc:205: Error parsing '[^\u0020-\u007E\n]|(\b.*(Mensagem|Antes|Loop|Movimentar|\|).*)|\\[0-9]{3,4}': invalid escape sequence: \u
re2/re2.cc:890: Invalid RE2: invalid escape sequence: \u

似乎 RE2 没有识别\u序列来寻找 Unicode 范围的字符。我在regexr.com上测试了这个表达式,并且在那里正常检测到无效字符。

这里有什么问题?

标签: c++regexunicodere2

解决方案


每个正则表达式引擎都有自己的语法,在 RE2 中您需要使用[^\x{0020}-\x{007E}\n]而不是[^\u0020-\u007E\n]. 请参阅语法文档

Escape sequences:
\a  bell (== \007)
\f  form feed (== \014)
\t  horizontal tab (== \011)
\n  newline (== \012)
\r  carriage return (== \015)
\v  vertical tab character (== \013)
\*  literal «*», for any punctuation character «*»
\123    octal character code (up to three digits)
\x7F    hex character code (exactly two digits)
\x{10FFFF}  hex character code
\C  match a single byte even in UTF-8 mode
\Q...\E literal text «...» even if «...» has punctuation

\u用于匹配大写字符并标记为不支持


推荐阅读