簡體   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