You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何含\r的字符串中std::regex与boost::regex匹配行为不同?

std::regex与boost::regex处理含\r字符串的匹配差异解析

当匹配字符串里存在\r时,std::regex和boost::regex的匹配逻辑确实存在明显差异:

  • 使用boost::regex可匹配到'234'和'28\r,234'两个结果
  • 而std::regex仅能匹配到两个'234'

这种差异的核心原因在于C++标准对正则表达式中行终止符的定义与处理规则:

  • std::regex严格遵循C++标准的默认规定,在ECMAScript模式下,会将\r认定为行终止符的组成部分(和\n共同构成Windows风格换行)。默认情况下,.元字符不会匹配行终止符,同时部分匹配逻辑会自动跳过单独的\r,导致包含\r的目标片段无法被匹配到。
  • boost::regex的默认实现未严格遵循该规则,而是更偏向「原始字符匹配」逻辑,不会将单独的\r视为行终止符,除非显式指定相关匹配选项。

如果需要让std::regex与boost::regex的行为对齐,可以给std::regex添加匹配选项:

  • 启用std::regex_constants::dotall,让.元字符匹配包括行终止符在内的所有字符
  • 或切换到std::regex_constants::extended模式,调整行终止符的识别规则

内容的提问来源于stack exchange,提问作者yi fu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 07:19:52