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

Perl regexp/(\r\n |\r |\n)/,regex,pcre,Regex,Pcre,我想知道如何在perl中解决这个模棱两可的模式(更一般地说,所有使用libpcre的东西): 当模式看到\r\n时,它会匹配一次还是两次? 面对这种情况,规则是什么 谢谢它将只匹配一次\r\n,因为Perl使用了一个正则表达式导向的引擎,它热切地求值替换。看 您可以很容易地找到您想要使用的正则表达式风格是具有文本导向引擎还是正则表达式导向引擎。如果反向引用和/或惰性量词可用,则可以确定引擎是正则表达式定向的。您可以通过将regexregex | regex not应用于字符串regex not来

我想知道如何在perl中解决这个模棱两可的模式(更一般地说,所有使用libpcre的东西):

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


谢谢

它将只匹配一次
\r\n
,因为Perl使用了一个正则表达式导向的引擎,它热切地求值替换。看

您可以很容易地找到您想要使用的正则表达式风格是具有文本导向引擎还是正则表达式导向引擎。如果反向引用和/或惰性量词可用,则可以确定引擎是正则表达式定向的。您可以通过将regex
regex | regex not
应用于字符串
regex not
来进行测试。如果结果匹配仅为
regex
,则引擎是regex定向的。如果结果是
regex not
,则它是文本定向的。这背后的原因是由regex引导的引擎是“急切的”


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

它将匹配一次。详情如下:

…perl(更一般地说,所有使用libpcre的东西)

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


但他们都有一个共同的特点:他们接受第一个有效的选择,而不是像文本导向引擎那样坚持最长的匹配时间。

最好的答案是测试。@Chad,你在写(实际上我只知道它匹配一次),但我想知道为什么,逻辑是什么。如果我理解正确,它意味着/(\r\n\r\n\124n)/有其他含义。是的,
/(\r\n\r\n\124n)/
将匹配
\r
,然后
\n
/(\r\n|\r|\n)/