繁体   English   中英

Perl贪婪regex不是代理贪婪

[英]Perl greedy regex is not acting greedy

提供以下代码:

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演示页面上看到regex调试器 ,以了解模式如何与您的字符串匹配。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM