2

最短一致を選択する正規表現を PERL で記述しようとしています。多くの一致を識別するものを作成しましたが、すべての一致の中で最も短いものを選択できるようにする必要があります。

次のテキストがあるとします。

$text = "blah BEG blah blah blah END blah blah BEG blah END blah BEG blah blah END";

この正規表現を使用して、BEG で始まり END で終わり、BEG と END の間に BEG または END がない 3 つのケースを識別できます。

/(BEG(?:(?!BEG|END).)*END)/

3 つのケースをキャプチャします。

BEG blah blah blah END
BEG blah END 
BEG blah blah END

2 つ目は 3 つの中で最も短いので、2 つ目だけを一致させたいと考えています。

すべての一致を配列にプルし、配列の最短要素を特定することを検討しました。

これを正規表現に組み込む簡単な方法はありますか?

あなたの考えと助けを前もってありがとう!

4

1 に答える 1

2
use List::Util qw( reduce );

my $shortest =
   reduce { length($a) < length($b) ? $a : $b }
      /(BEG(?:(?!BEG|END).)*END)/s;

これは完全に Perl 正規表現で (組み込みの Perl コードを使用して) 行うことができますが、絶対に必要でない限り、ばかげています。

my ($shortest) = /
   ( BEG (?:(?!BEG|END).)* END )
   (?!
      .*
      ( BEG (?:(?!BEG|END).)* END )
      (?(?{ length($2) >= length($1) })(*FAIL))
   )
/sx;
于 2012-07-06T18:44:15.223 に答える