我正在C++中开发一个应用程序,该应用程序通过使用Google RE2库使用regex验证配置文件。配置文件的内容被读取到一个std::字符串中;
到目前为止,我声明了这个包含正则表达式的字符串:
const string EXPR_FAILED_FILE(R"([^u0020-u007En]|(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-u007En]|(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-u007En]
。参见语法文档:
Escape sequences:
a bell (== 07)
f form feed (== 14)
t horizontal tab (== 11)
n newline (== 12)
r carriage return (== 15)
v vertical tab character (== 13)
* 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
用于匹配大写字符,并标记为不支持