为何std::regex_match在不同环境下执行相同代码返回结果不一致?
问题根因
你遇到的现象是GCC 5.x版本的std::regex实现缺陷导致的。GCC的libstdc++标准库从GCC 4.9才开始初步支持正则表达式特性,直到GCC 6.x版本才完成全功能稳定实现,你使用的GCC 5.4.0版本的std::regex存在大量已知匹配bug,对URL这类规则复杂的正则表达式场景经常会出现匹配结果不符合预期的问题,和高版本编译环境的运行结果不一致是该版本的已知问题。
可行解决方案
- 方案1:升级编译器版本
你可以在Ubuntu 16.04环境中通过添加官方工具链测试源安装GCC 7及以上版本,使用高版本GCC编译代码即可修复std::regex匹配异常问题。 - 方案2:替换正则库实现
若不方便升级系统编译器,可以改用成熟的第三方正则库,比如Boost.Regex,其API设计和std::regex几乎完全一致,仅需修改少量命名空间代码即可完成适配,跨版本运行结果稳定。 - 方案3:规避正则使用
如果不能引入第三方依赖,也可以拆分URL校验逻辑,不用复杂正则表达式,分步骤校验协议头、域名、路径等各段的合法性,避开当前版本std::regex的缺陷。
内容的提问来源于stack exchange,提问作者Yves
相关产品推荐
相关产品推荐

