Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Perl贪婪正则表达式的行为并不贪婪_Regex_Perl - Fatal编程技术网

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你误解了我的问题,我说的是第二个
*
如果我错了请纠正我,因此在搜索模式时,它将首先尝试查找分组之外的“事物”,然后搜索由外部规则分隔的文本?在这种情况下,它搜索括号,找到它们,然后在括号之间的文本中搜索
*
,对吗?不对。我在答案上加了解释。