扩展POSIX语法下C正则库与C++正则库的行为差异问题
问题核心原因
标准POSIX扩展正则语法不支持
\s转义
POSIX正则规范(包括基础和扩展版本)中没有定义\s作为空白字符的简写,匹配空白的标准写法是POSIX字符类[[:space:]]。\s属于ECMAScript/Perl体系的正则语法,不属于POSIX标准要求的内容。两个库的实现严格度不同
- C POSIX正则库(常见为glibc的实现)对标准做了非官方扩展,默认兼容
\s这类Perl风格的简写转义,因此可以正常解析运行。 - C++标准库的
std::regex在指定regex_constants::extended标记时,严格遵循POSIX扩展正则的标准定义,遇到标准中未定义的转义序列\s就会直接抛出regex_error异常。
附加注意点
你代码中写的string pattern = "\s"本身属于非标准的C字符串字面量:C标准只定义了\n、\t等少数转义序列,\s不属于合法转义,属于未定义行为。如果要在字符串中存储真正的\+s组合,需要写成"\\s",或者使用C++11及以上版本的原始字符串字面量R"(\s)"。
解决方案
- 如果你需要保持POSIX扩展语法兼容两边,将正则模式改为
"[[:space:]]"即可正常运行。 - 如果你要使用
\s这类简写语法,使用std::regex默认的ECMAScript语法模式即可,不需要额外指定regex_constants::extended标记。
内容的提问来源于stack exchange,提问作者E G
相关产品推荐
相关产品推荐

