解码传统的正则表达式:它看起来落后并展望未来?

时间:2014-06-03 23:27:07

标签: regex perl

我很难用正则表达式阅读传统的Perl代码,

$string =~ m/^\(\?\<\!\\S\)/ && $string =~ m/\(\?\!\\S\)$/

我确实理解正则表达式中正/负前瞻/后退的基本思想, 但是,对我来说,真正的意图让我很困惑。

有人可以解释一下吗? 谢谢!

2 个答案:

答案 0 :(得分:4)

遗留代码 中的正则表达式可以更改清楚:

$string =~ m{^\Q(?<!\S)\E} && $string =~ m{\Q(?!\S)\E$}

基本上,这会匹配以文字'(?<!\S)'开头并以文字'(?!\S)'结尾的字符串。事实上,我们可以修改这个逻辑,根本不使用正则表达式:

substr($string, 0, 7) eq '(?<!\S)' && substr($string, -6) eq '(?!\S)'

这些文字字符串本身看起来像背后的正则表达式负面看并向前看断言,但正则表达式实际上只是试图匹配文字字符串。

答案 1 :(得分:1)

如果变量$string 以字符序列(?<!\S)开始,则此表达式返回true,并且变量不以字符序列结尾(?!\S)

似乎是代码正在寻找看起来像正则表达式的字符串,从负面的lookbehinds开始,而不是以负向前瞻结束。

所以meta。