Regex Perl贪婪正则表达式的行为并不贪婪
给出以下代码:Regex Perl贪婪正则表达式的行为并不贪婪,regex,perl,Regex,Perl,给出以下代码: use strict; use warnings; my $text = "asdf(blablabla)"; $text =~ s/(.*?)\((.*)\)/$2/; print "\nfirst match: $1"; print "\nsecond match: $2"; 我原以为$2会赶上我的最后一个括号,但我的输出是: 如果默认情况下,*是贪婪的,为什么它会停在括号中?该*是贪婪的子模式,但它不考虑分组。分组是用一对不带括号的括号定义的(请参见) 查看您的组边界
use strict;
use warnings;
my $text = "asdf(blablabla)";
$text =~ s/(.*?)\((.*)\)/$2/;
print "\nfirst match: $1";
print "\nsecond match: $2";
我原以为$2
会赶上我的最后一个括号,但我的输出是:如果默认情况下,
*
是贪婪的,为什么它会停在括号中?该*
是贪婪的子模式,但它不考虑分组。分组是用一对不带括号的括号定义的(请参见)
查看您的组边界的位置:
s/(.*?)\((.*)\)/$2/
| G1| |G2|
因此,与(
和\)
匹配的(
和)
在组外,既不属于$1
也不属于$2
如果您需要)
成为$2的一部分,请使用
s/(.*?)\((.*\))/$2/
^
正则表达式引擎从左到右处理字符串和模式。首先处理第一个(.*)
,它匹配到第一个文本(
符号,因为它是惰性的(在返回有效匹配之前匹配尽可能少的字符),然后将之前的整个部分(
放在组1堆栈中。然后,匹配(
),但不捕获(.*)
匹配除换行符以外的任何0多个字符直到最后一个)
符号,并将捕获放入组2中。然后,)
刚好匹配。关键是*
将整个字符串一直抓取到最后,但由于引擎试图容纳最后一个),因此会发生回溯。)
在模式中。)
必须匹配,但不能在模式中捕获,因此,由于组边界的位置,它不是组2的一部分。您可以在上查看regex调试器,以查看模式与字符串的匹配情况。您实际上是在模式中定义的:)
(与\)
)必须在组2之外。*?
是懒惰的@Jan你误解了我的问题,我说的是第二个*
如果我错了请纠正我,因此在搜索模式时,它将首先尝试查找分组之外的“事物”,然后搜索由外部规则分隔的文本?在这种情况下,它搜索括号,找到它们,然后在括号之间的文本中搜索*
,对吗?不对。我在答案上加了解释。