使用std::regex_search触发std::regex_error终止错误的求助
解决std::regex_error问题的方案
问题原因
当前编译器的std::regex实现对合并后的复杂正则表达式存在兼容性问题,导致触发语法错误。
方案1:拆分正则表达式
将原正则的三个检测分支拆分为独立的正则对象,分别执行匹配,避免复杂正则的语法兼容问题:
bool checkConditionValidity(std::string str){ // 检测非法字符:非()、空白、字母数字、.、&、=的字符 std::regex invalid_chars(R"([^()\s\w.&=])"); if (std::regex_search(str, invalid_chars)) return true; // 检测等于号前后均不为等于号的情况 std::regex eq_pattern(R"([^=]=[^=])"); if (std::regex_search(str, eq_pattern)) return true; // 检测&前后均不为&的情况 std::regex amp_pattern(R"([^&]&[^&])"); if (std::regex_search(str, amp_pattern)) return true; return false; }
方案2:用自定义代码替代正则
完全依赖标准库的字符、字符串处理函数实现需求,彻底规避std::regex的兼容性问题:
#include <string> #include <cctype> bool checkConditionValidity(std::string str){ // 检查非法字符 const std::string allowed_symbols = "() .&="; for (unsigned char c : str) { if (!std::isalnum(c) && allowed_symbols.find(static_cast<char>(c)) == std::string::npos) { if (!std::isspace(c)) { return true; } } } // 检查等于号前后非等于号 for (size_t i = 1; i < str.size() - 1; ++i) { if (str[i] == '=' && str[i-1] != '=' && str[i+1] != '=') { return true; } } // 检查&前后非& for (size_t i = 1; i < str.size() - 1; ++i) { if (str[i] == '&' && str[i-1] != '&' && str[i+1] != '&') { return true; } } return false; }
补充说明
- 若使用方案1,可尝试显式指定正则语法为
std::regex::ECMAScript(默认值),部分编译器需显式声明才能正确解析:std::regex pattern(R"([^()\s\w.&=])", std::regex::ECMAScript); - 确保编译器版本较新,旧版本std::regex存在较多兼容性bug。
内容的提问来源于stack exchange,提问作者Alagusankar
相关产品推荐
相关产品推荐

