1

Perl でのパターン マッチングの仕組みを知りたいです。

私のコードは次のとおりです。

my $var = "VP KDC T. 20, pgcet. 5, Ch. 415, Refs %50 Annos";

if($var =~ m/(.*)\,(.*)/sgi)
{
    print "$1\n$2";
}

コンマの最初の出現が一致する必要があることを学びました。しかし、ここでは最後のオカレンスが一致しています。私が得た出力は次のとおりです。

VP KDC T. 20, pgcet. 5, Ch. 415
 Refs %50 Annos

誰かがこのマッチングの仕組みを説明してくれませんか?

4

4 に答える 4

6

ドキュメントから:

デフォルトでは、量化されたサブパターンは「貪欲」です。つまり、(特定の開始位置が与えられた場合) できるだけ多くの回数一致する一方で、パターンの残りの部分は引き続き一致します。

だから、最初(.*)は可能な限りかかります。

簡単な回避策は、貪欲でない量指定子を使用することです: *?. または、すべての文字ではなく、コンマを除くすべての文字に一致します([^,]*)

于 2013-02-27T07:23:54.653 に答える
4

貪欲と貪欲でないマッチング

通常、Perl の正規表現は可能な限り長い文字列に一致します。

例えば:

my($text) = "mississippi";
$text =~ m/(i.*s)/;
print $1 . "\n";

上記のコードを実行すると、次のようになります。

ississ

最初の i、最後の s、およびそれらの間のすべてに一致します。しかし、最初の i をそれに続く最も近い s に一致させたい場合はどうすればよいでしょうか? 次のコードを使用します。

my($text) = "mississippi";
$text =~ m/(i.*?s)/;
print $1 . "\n";

コードが生成するものを見てください。

is

明らかに、疑問符を使用すると一致が貪欲になくなります。しかし、正規表現は常にできるだけ早く一致しようとするという別の問題があります。

ソース: http://www.troubleshooters.com/codecorn/littperl/perlreg.htm

于 2013-02-27T07:33:37.420 に答える
1

正規表現で疑問符を使用します。

if($var =~ m/(.*?)\,(.*)/sgi)
{
    print "$1\n$2";
}

そう:

  • (.*)\, 意味: 「後にコンマがある限り、できるだけ多くの文字に一致する」
  • (.*?)\, 意味: 「コンマに遭遇するまで任意の文字に一致」
于 2013-02-27T07:23:56.600 に答える
0

(.*)\,-最初のコンマまで一致することを期待するかもしれません。しかし、最初のコンマではなく、最後のコンマまで遭遇したすべての xcharacters に一致するほど貪欲です。したがって、最後のコマンドまで一致します。2 番目の一致は行の残りの部分です。

貪欲なパターンマッチを避けるために adda ?after*

于 2013-02-27T07:41:10.817 に答える