为何boost::regex无法识别转义小于号?前两个断言却通过
正则断言成功与失败的原因解析
先看给出的测试代码:
int main() { assert(boost::regex_match("\"", boost::regex("\\\""))); assert(boost::regex_match(".", boost::regex("\\."))); assert(!boost::regex_match("a", boost::regex("\\."))); assert(boost::regex_match("<", boost::regex("\\<"))); // 此断言失败 }
前两个断言通过的逻辑
第一个断言:
C++字符串里的\\\"会被编译器处理成\"(两个反斜杠转义为单个反斜杠,再结合双引号),传给Boost正则引擎的规则就是\"——这代表匹配字面量的双引号。输入字符串正好是",完全匹配,断言通过。第二个断言:
C++字符串中的\\.会被解析为\.,正则语法里.默认是匹配任意单个字符的通配符,转义成\.后就失去了通配作用,专门匹配字面量的.字符。输入字符串是.,刚好匹配,断言自然通过。
第三个断言取反后成立,也是因为\.只匹配.,不匹配a,所以!regex_match("a", ...)结果为真。
最后一个断言失败的原因
C++字符串\\<被处理成\<,Boost正则默认使用POSIX基本正则表达式(BRE)语法,在这个语法里\<是单词起始边界锚点——它用来匹配字母/数字/下划线组成的单词的开头位置,不是用来匹配字面量的<字符。输入的是单个<,它不属于单词边界范畴,正则引擎找不到匹配,所以断言失败。
如果要匹配字面量的<,直接写boost::regex("<")即可,不需要额外转义。
内容的提问来源于stack exchange,提问作者Maxim Popov
相关产品推荐
相关产品推荐

