c++ - 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上测试了这个表达式,并且在那里正常检测到无效字符。
这里有什么问题?
解决方案
每个正则表达式引擎都有自己的语法,在 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
用于匹配大写字符并标记为不支持
推荐阅读
- php - 在magento 2中更改产品的Url键时,您如何不替换/被 -
- javascript - 每次页面刷新时更改类名
- python - 导出到 csv 文件时出现 OSError Invalid arg 错误
- javascript - Discord Bot 自动发送消息
- verilog - 如何防止 Verilog 中的推断锁存和锁存不安全行为?
- java - 带有 Google api 密钥的 GoogleAccountCredential
- google-cloud-platform - Google Cloud Shell:如何找到您的网络预览网址
- php - 在 laravel 中显示 404 上的索引刀片
- sql - Hive 3.1“带有本地时区的时间戳”问题
- javascript - document.write vs console.log vs innerHTML