2015-10-05 32 views
6

我们刚在程序员使用(.)+时应用(.+)时发现了一些错误。一个简单的修复,但我们无法解释(.)+的行为。任何人都可以解释为什么这匹配“e”,最后一个字母,而不是“b”,正则表达式中的“a”之后的第一个字母?你会如何解释(.)+(。)+在正则表达式中的行为是什么?

my $s = 'abcde'; 

if ($s =~ m{ a (.)+ }x){ 
    print "s '$s' matched '$1'\n"; 
}else{ 
    print "total match fail\n"; 
} 

__END__ 
output: 
s 'abcde' matched 'e' 
+1

我相信这背后的原因是因为它保持匹配,直到它无法匹配模式。在哪一点,它是捕获组中最后一个匹配的字符。 –

+1

尝试在代码的顶部添加'use re'debug';'。这对跟踪正在发生的事情很有用。 – Sobrique

+4

我喜欢[重复捕捉组与重复组捕捉]中的解释(http://www.regular-expressions.info/captureall.html)。 – ThisSuitIsBlackNot

回答

10

有,但只有在什么条件捕获和(.)+之间(.+)一个巨大的差异,不是匹配。

(.)+查找单个字符的一个或多个实例并捕获其中的最后一个。

(.+)查找一个或多个单个字符并一次捕获所有这些字符。

+0

我不知道如何记录/安全'(。)+'是。我会使用'(。)。*'。 – ikegami

+3

@ikegami不应该是'。*(。)'? – AnFi

+0

@Andrzej A.菲利普,ack!是的,我的意思是'。*(。)' – ikegami