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

时间:2010-07-28 14:17:19

标签: regex pcre

我想知道这个模糊的模式是如何在perl中解决的(更常见的是使用libpcre的所有内容):

/(\r\n|\r|\n)/

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

由于

4 个答案:

答案 0 :(得分:7)

它将匹配\r\n一次因为Perl使用正则表达式引擎来急切地评估交替。请参阅here

  

您可以轻松找出您打算使用的正则表达式风格是否具有文本定向或正则表达式引导。如果可以使用反向引用和/或延迟量词,则可以确定引擎是正则引导的。您可以将正则表达式regex|regex not应用于字符串regex not来进行测试。如果结果匹配仅为regex,则引擎是正则表达式。如果结果为regex not,则它是文本导向的。这背后的原因是正则表达式引擎是“急切的”。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

  

... perl(更常见的是使用libpcre的所有内容)

这里可能存在误解:Perl不“使用libpcre”。 PCRE库是一个单独的项目,它出现在之后的 Perl,并且模仿了Perl的正则表达式功能。 PHP和ActionScript使用libpcre,但大多数“Perl派生”版本(如Python,Java和.NET)本身都实现了它们的正则表达式支持。

但是他们在这里都有一个共同的特点:他们选择了第一个有效的替代方案,而不是像文本导向引擎那样坚持最长的匹配。

答案 3 :(得分:0)

它会匹配一次。更多信息:http://technocage.com/~caskey/dos2unix/