Perl regexp /(\r\n|\r|\n)/

3
我想知道如何在Perl中解决这种模糊模式(更一般地说,所有使用libpcre的内容):
/(\r\n|\r|\n)/

当模式匹配到\r\n时,它会匹配一次还是两次?针对这种情况的规则是什么?
谢谢。

1
最好的答案是测试它。 - CaffGeek
@Chad,你是对的(实际上我知道它只匹配一次),但我想知道为什么,什么是逻辑。 - mathk
4个回答

7

由于Perl使用正则表达式引擎,该引擎会急切地评估交替项,因此它将匹配\r\n一次。请参见这里

您可以轻松找出您打算使用的正则表达式引擎是文本定向还是正则表达式定向。如果可用反向引用和/或惰性量词,则可以确定引擎为正则表达式定向。您可以通过将正则表达式regex|regex not应用于字符串regex not来进行测试。如果结果匹配仅为regex,则引擎为正则表达式定向。如果结果为regex not,则为文本定向。原因是正则表达式定向引擎是“急切”的。


如果我理解正确,它意味着/(\r|\r\n|\n)/有另一种含义。 - mathk
1
是的,/ (\r | \r\n | \ n) / 将匹配 \r,然后是 \n - Alan Moore

1

它将尝试从左到右按顺序匹配以管道分隔的备选项。因此,第一个备选项将匹配整个字符串"\r\n",并且只会有一个匹配。这里没有歧义。


1
...Perl(更一般地说,所有使用libpcre的东西)
可能存在误解:Perl并不“使用libpcre”。PCRE库是一个独立的项目,比Perl要晚,并模仿了Perl的很多正则表达式功能。PHP和ActionScript使用libpcre,但大多数“基于Perl”的风格(如Python、Java和.NET)在本地实现了它们的正则表达式支持。
但它们都共享这里所述的特点:它们满足第一个能够起作用的选择,而不像以文本为导向的引擎一样坚持最长匹配。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接