此代码段来自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.
答案 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它们备份时,这个人首先不会消耗它们。但并不总是这样做。例如,如果要排除的内容是整个单词而不是单个字符,该怎么办?这可能会变得非常丑陋,真正快速。我的意思是,查看您必须输入的所有字符,仅用于此基本匹配任务。