トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

8-8 組み込みコードで最長マッチの表示

正規表現パズル

Perlで最長マッチを行います。

詳説正規表現2版の325ページ
詳説正規表現3版の328ページ
を参考にさせていただきました。


解説

組み込みコードでマッチ結果の文字列を保存しつつ、
最大長のマッチ結果を求めてます。


Perlでのソースと実行結果

use re 'eval';
$ConstRegex = '(AB|ABBB|ABC)';
@hairetu = ();
push(@hairetu,'ABC');
push(@hairetu,'ABBB');
push(@hairetu,'AB');
push(@hairetu,'DD');

print ("Pattern $ConstRegex\n");
for ($i=0; $i <= @hairetu-1; $i++) {
    $longestMatch = undef;
    $LineNo = $i+1;
    $willOut = "Line$LineNo $hairetu[$i] ";

    $hairetu[$i] =~ m/$ConstRegex
                      (?{if (not defined($longestMatch)
                             or
                             length($&) > length($longestMatch)){
                                 $longestMatch = $&;
                             }
                         })(?!)/x;
    if (defined($longestMatch)){
        $willOut .= "matchs $longestMatch";
    }
    else{
        $willOut .= 'no match'
    }
    print "$willOut\n";
}

#実行結果
Pattern (AB|ABBB|ABC)
Line1 ABC matchs ABC
Line2 ABBB matchs ABBB
Line3 AB matchs AB
Line4 DD no match