C++ regex::egrep与egrep命令行为不一致的解决方法
问题原因
在Visual Studio 2019(v142工具集,采用/std:c20编译标准)环境下执行以下代码返回false,本质是C正则接口和命令行egrep的语义差异,不是regex::egrep模式实现错误:
std::regex_match("99", std::regex("9", std::regex::egrep));
两者的匹配判定逻辑区别如下:
std::regex_match的设计语义是要求正则表达式完整匹配整个目标字符串才返回真值,因此用正则"9"匹配长度为2的字符串"99"时,因为正则无法覆盖全部字符,必然返回false,如果非要用这个接口实现egrep效果,需要把正则改写为.*9.*这类能覆盖全串的形式。- 命令行
grep -E(即别名egrep)的默认匹配逻辑是:只要目标字符串中存在任意一个符合正则规则的子串,就判定为匹配成功。
解决方案
不需要深究这个设计差异的底层原因,直接将匹配检测的调用接口从std::regex_match()替换为std::regex_search()即可。std::regex_search()的逻辑是扫描整个待匹配字符串,只要存在符合正则的子串就返回匹配成功,和egrep的默认表现完全一致。
修正后的调用示例:
#include <regex> #include <string> // 该调用返回true,和执行 echo "99" | grep -E "9" 的结果一致 bool match_ret = std::regex_search("99", std::regex("9", std::regex::egrep));
内容的提问来源于stack exchange,提问作者Wasfi JAOUAD
相关产品推荐
相关产品推荐

