Google RE2 无法识别正则表达式中的 Unicode 转义

fbo*_*s22 2 c++ regex unicode re2

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

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

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

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

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

当我运行代码时,我在 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
Run Code Online (Sandbox Code Playgroud)

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

这里可能出了什么问题?

phu*_*clv 6

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

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

\\u用于匹配大写字符并标记为NOT SUPPORTED

\n