Perl正则表达式锚点$处理末尾换行符的逻辑是怎样的?
Perl正则
$锚点匹配行为的原因 这是Perl正则表达式的原生默认设计,和操作系统、架构、Perl版本无关。
Perl的$结束锚点默认匹配规则为:匹配字符串的末尾位置,或者字符串末尾换行符\n之前的位置。这个设计的初衷是简化行文本的匹配逻辑——多数情况下读取的单行文本末尾会自带换行符,用$可以直接匹配行内容的结尾,不需要额外调用chomp去除末尾换行。
测试案例匹配逻辑解释
- 第一个测试字符串
"hello world":末尾无换行,字符d正好处于字符串末尾,/d$/匹配成功 - 第二个测试字符串
"hello world\n":字符d后面紧跟末尾换行符\n,$可以匹配d和\n之间的位置,/d$/匹配成功 - 第三个测试字符串
"hello world\t":字符d后面是制表符\t,既不是字符串末尾,也不是末尾换行之前的位置,/d$/匹配失败
严格匹配绝对字符串末尾的方法
如果要取消$的换行兼容逻辑,严格匹配字符串最后一个字符的后方位置,请使用\z锚点:
将正则替换为/d\z/后,就只会匹配第一个不带末尾换行的字符串,符合最初的预期。
其余测试结果的合理性说明
/d\n$/仅匹配第二个字符串:需要先匹配d后的\n,再匹配\n后方的字符串末尾,只有带末尾换行的第二个字符串符合规则/d\s$/匹配第二、第三个字符串:\s元字符可匹配换行、制表符等空白字符,第二个字符串d后是\n(属于\s),第三个字符串d后是\t(属于\s),二者都满足空白字符后接$锚点的规则,因此都匹配成功。
内容的提问来源于stack exchange,提问作者MSohnius
相关产品推荐
相关产品推荐

