2016-07-26 13 views
2

演技されていません。
Perlの貪欲な正規表現は、次のコードを与える貪欲

use strict; 
use warnings; 

my $text = "asdf(blablabla)"; 

$text =~ s/(.*?)\((.*)\)/$2/; 
print "\nfirst match: $1"; 
print "\nsecond match: $2"; 

を私は$2が私の最後のブラケットをキャッチすると予想、まだ私の出力は次のようになります。
enter image description here
.*場合は、デフォルトでは、なぜそれは貪欲ですそれは括弧で止まった?

+4

あなたは実際のパターンでそれを定義した: ')(' \ 'と一致する)は、')グループ2 –

+1

'外でなければなりません*'怠惰**です**。?! – Jan

+0

あなたは私の質問にmissunderstandingている@Jan、私は '秒話していた。*' –

答えて

4

.*は貪欲サブパターンであるが、それは、グループ化を考慮していません。グループ化は、エスケープされていないカッコで定義されます(Use Parentheses for Grouping and Capturing参照)。

あなたのグループの境界がある関連項目:

だから、
s/(.*?)\((.*)\)/$2/ 
    | G1| |G2| 

()をマッチング\(\)はグループ外あり、そして$1$2でもないの一部ではありません。あなたは)$2の一部である必要がある場合は

、正規表現エンジンは、文字列と左から右へのパターンの両方を処理している

s/(.*?)\((.*\))/$2/ 
      ^

を使用しています。最初(.*?)が最初に処理し、それは怠惰であるとして、それは最初のリテラル(シンボルまで一致している(それが有効な一致を返すことができます前に、できるだけ少ない文字にマッチする)、および(前に全体の一部には、グループ1つのスタックに置かれます。 )がちょうど一致している、その後、(が捕獲マッチしますが、されていない場合、(.*)は最後)のシンボルに改行まで以外の任意の0+文字に一致し、グループ2にキャプチャを配置します。ポイントは.*が最後まで文字列全体をつかむが、エンジンは、パターンの最後の)に適応しようとするので、次にバックトラックが起こることです。 )は一致する必要がありますが、パターンには取り込まれていないため、グループ境界の配置のためにグループ2の一部ではありません。 正規表現デバッガthis regex demo pageにあり、パターンが文字列とどのように一致するかを確認できます。

+0

Corect私のパターンを検索するときに私が間違っているので、それは最初のグループの「もの」の外を見つけようとしてから検索する場合は外の規則で区切られた文章で? –

+0

この場合、大括弧を検索し、それらを見つけて、大括弧で囲まれたテキスト内の '。*'を検索しました。 –

+1

それは正しくありません。答えに説明を加えました。 –

関連する問題