最近正規表現が気になっています。かなり邪道ですが、正規表現で
1:2:2:3:2:4:6:5:6:4:
というような数列が和が10となる部分列をもつか判定したいのです(数字はとりあえず1桁限定)。
いわゆる標準正規表現ではかなり難しいようですが、
正規表現のPerl拡張、動的正規表現
(?{code}) #codeを実行
(??{code})#codeを実行し正規表現として評価
をつかうと下記のような正規表現で、#1:2:2:3:2:を見つけることができています。これはいろいろ使えそうなんですが、どなたかぜひ、もっとエレガントな書きかたの伝授をよろしくお願いします。
my $text = "1:2:2:3:2:4:6:5:6:4:";
$text =~ m/
(?{local $i = 10}) #10を設定
(
(
(
(??{join("|",(0..$i))}) #一回目は"(0|1|2|3|4|5|6|7|8|9|10)"にマッチ。
)#マッチした文字をキャプチャ
:
(?{$i-=$+}) #$+にキャプチャした数字分$iを減算
)+ #マッチする間繰り返す。
)
(?(?{$i == 0})|z) #$i == 0なら終了
/x;
print $1."\n";
0 件のコメント:
コメントを投稿