Google RE2 无法识别正则表达式中的 Unicode 转义
Google RE2 doesn't recognize Unicode escape in regex
我正在用 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 测试了这个表达式,那里通常检测到无效字符。
这里可能有什么问题?
每个正则表达式引擎有 its own syntax and in RE2 you need to use [^\x{0020}-\x{007E}\n]
instead of [^\u0020-\u007E\n]
. See the syntax document:
Escape sequences:
\a bell (== [=10=]7)
\f form feed (== 4)
\t horizontal tab (== 1)
\n newline (== 2)
\r carriage return (== 5)
\v vertical tab character (== 3)
\* literal «*», for any punctuation character «*»
3 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
用于匹配大写字符,标记为NOT SUPPORTED
我正在用 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 测试了这个表达式,那里通常检测到无效字符。
这里可能有什么问题?
每个正则表达式引擎有 its own syntax and in RE2 you need to use [^\x{0020}-\x{007E}\n]
instead of [^\u0020-\u007E\n]
. See the syntax document:
Escape sequences:
\a bell (== [=10=]7)
\f form feed (== 4)
\t horizontal tab (== 1)
\n newline (== 2)
\r carriage return (== 5)
\v vertical tab character (== 3)
\* literal «*», for any punctuation character «*»
3 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
用于匹配大写字符,标记为NOT SUPPORTED