将Boost正则表达式迁移至C++标准库时遇regex_error错误求助
问题解决:std::regex_error - 大括号表达式中有意外字符
错误原因
你的正则表达式存在两处关键问题:
- 非法的量词语法:
\.{[0-9],[0-9]}中的{}在标准C++正则(默认ECMAScript语法)里是量词标记,仅用于指定匹配次数(比如{2}匹配2次、{1,3}匹配1-3次),不能在大括号内放置[0-9],[0-9]这类字符类组合,这直接触发了正则解析错误。 - 转义字符遗漏:C字符串中,要表示正则里的字面量
.(而非通配符),需要用\\.而非\.——后者在C字符串中会被编译器视为无效转义,最终导致正则里的.变成匹配任意字符的通配符,偏离你的预期。
另外,std::string tRegex = ".{0.7}";大概率是笔误:如果是想匹配0-7个任意字符,应该写成.{0,7}(用逗号分隔次数范围),否则当前写法会匹配字面量0.7被大括号包裹的结构。
修正后的代码
假设原Boost正则的意图是匹配「.+数字,数字」或「纯大写字母」的结构,修正后的代码如下:
std::string tRegex = ".{0,7}"; // 修正次数范围的分隔符为逗号 // 用小括号分组数字部分(不需要分组可直接去掉括号),同时修正转义 std::regex regex1("\\.([0-9],[0-9])[A-Z]*|[A-Z]+"); std::regex regex2("[A-Z]*\\.([0-9],[0-9])|[A-Z]+"); std::sregex_token_iterator titer(tRegex.begin(), tRegex.end(), regex1, 0);
额外说明
如果原Boost正则使用了非ECMAScript语法(比如POSIX扩展语法),可以通过指定语法选项兼容原有写法,但不推荐(跨平台一致性差):
// 使用POSIX扩展语法构造正则 std::regex regex1("\\.{[0-9],[0-9]}[A-Z]*|[A-Z]+", std::regex::extended);
内容的提问来源于stack exchange,提问作者Andrea Palmate'
相关产品推荐
相关产品推荐

