这种消极的外观是如何运作的?

时间:2014-06-10 11:19:02

标签: regex perl negative-lookbehind

此代码段来自Mastering Regular Expressions一书。我无法理解带有负面背后的最后一部分(评论# Not allowed to end with [.,?!])。该表达式将如何从[?!,.]http://www.google.com/foo!下降http://www.google.com/bar\!

# Turn HTTP URLs into links . . . 
$text =~ s{
   \b
   # Capture the URL to $1 . . . 
   (
      http:// [-a-z0-9]+(\.[-a-z0-9]+)*\.(com|edu|info) \b   # hostname
      (
         / [-a-z0-9_:\@&?=+,.!/~*'%\$]* # Optional path
         (?<![.,?!])    # Path not allowed to end with [.,?!]
      )?
   )
}{<a href="$1">$1</a>}gix;

print $text; # Finally, display the HTML-ized text.

2 个答案:

答案 0 :(得分:4)

不会。在表达式的部分中,可选路径正在匹配,并且由于http://www.google.com中没有路径,因此它将无效。

答案 1 :(得分:3)

这个想法是,当[-a-z0-9_:@&?=+,.!/~*%\$]+消耗掉所有能量时,它就会控制到后视。如果lookbehind看到其中一个句子 - 标点字符,它会报告失败并将手控制回到[-a-z0-9_:\@&?=+,.!/~*%\$]+部分。它支持一个位置,&#34;回馈&#34;它消耗的最后一个角色,然后再次移到后面。

www.google.com/foo!的情况下,lookbehind现在将查看o,因此它报告成功并且整体匹配成功。

但是,当您尝试匹配www.google.com/bar\!时,后视镜永远不会有机会看到爆炸声(!)。 [-a-z0-9_:\@&?=+,.!/~*%\$]+与反斜杠不匹配,因为它们在网址中不合法。它在消耗r后停止,这次后视成功而不必回溯。

编辑:回复评论中的问题:是的,您可以使用以下内容:

\b(https?|ftp|file)://[-A-Z0-9+&@#/%?=~_|$!:,.;]*[A-Z0-9+&@#/%=~_|$]

当lookbehind正则表达式使用无效字符和barfs它们备份时,这个人首先不会消耗它们。但并不总是这样做。例如,如果要排除的内容是整个单词而不是单个字符,该怎么办?这可能会变得非常丑陋,真正快速。我的意思是,查看您必须输入的所有字符,仅用于此基本匹配任务。