Perl正则前瞻/后顾表达式与PCRE匹配结果不一致问题咨询
问题原因及解决方案
1. 首要错误:Bash命令的HTML实体未转义
你在正则表达式和测试数据中直接使用了HTML转义实体",而Bash和Perl不会自动将其解析为双引号":
- 正则表达式内写
"时,Perl会尝试匹配字面的"字符串,而非你预期的双引号字符,自然无法得到匹配结果。 - 管道传递的测试数据里的
"也同样未被解析为双引号,和你在Regexr上的测试场景完全不一致。
2. 第二个问题:Perl可变长度后顾的支持限制
你收到的实验性提示是因为正则中使用了长度不固定的负向后顾断言:
- PCRE引擎对可变长度后顾的支持更宽松,允许匹配长度在一定范围内的分支共存,嵌套后顾也可以正常解析。
- Perl 5.30+虽然实验性支持可变长度后顾,但要求同一个后顾断言内的所有可选分支的匹配长度必须完全一致,你写的
(?<!^|,|(?<!^|,)"中,^是零宽、,是1字符长度、嵌套后顾加双引号的分支长度不符合Perl的要求,就算修复了引号问题也无法正常匹配。 - Perl本身支持嵌套前瞻/后顾语法,不兼容的原因是可变长度断言的限制,和嵌套特性无关。
修正后的可用方案
你可以把正则调整为Perl兼容的写法,同时修正Bash引号转义即可得到预期结果:
echo 'one,"George "Georgie"","Washington"' | perl -ne '/(?<![^,]["][^,])"(?![^,]["][^,])/ && print'
你也可以把原正则的可变长度后顾拆分为多个固定长度的独立断言,也可以规避Perl的兼容问题。
内容的提问来源于stack exchange,提问作者Ben Kean
相关产品推荐
相关产品推荐

