2015年5月1日金曜日

Perl 正規表現雑伎

最近正規表現が気になっています。かなり邪道ですが、正規表現で

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 件のコメント:

コメントを投稿