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

8-2 動的正規表現構文

正規表現パズル

行頭に出現した数字の数だけ文字Xがある行を検索する。
2XX
3XXX
12XXXXXXXXXXXX
などがヒットする。

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


対象データ

1XX
2XX
3XX
1XXX
2XXX
3XXX
12XXXXXXXXXXX
12XXXXXXXXXXXX
12XXXXXXXXXXXXX


正規表現

^([0-9]+)(??{"X{$1}"})$


解説

詳説正規表現3版の331ページに記述されてますが、
動的正規表現構文を使う場合は、
use re 'eval';
を記述するか、正規表現をベタで記述する必要があるようです。


Perlでのソースと実行結果

use re 'eval';
$ConstRegex = '^([0-9]+)(??{"X{$1}"})$';
@hairetu = ();
push(@hairetu,'1XX');
push(@hairetu,'2XX');
push(@hairetu,'3XX');
push(@hairetu,'1XXX');
push(@hairetu,'2XXX');
push(@hairetu,'3XXX');
push(@hairetu,'12XXXXXXXXXXX');
push(@hairetu,'12XXXXXXXXXXXX');
push(@hairetu,'12XXXXXXXXXXXXX');

print ("Pattern $ConstRegex\n");
for ($i=0; $i <= @hairetu-1; $i++) {
    $LineNo = $i+1;
    $willOut = "Line$LineNo $hairetu[$i] ";
    if ($hairetu[$i] =~ m/$ConstRegex/){
        $willOut .= "matchs $&";
    }
    else{
        $willOut .= 'no match'
    }
    print "$willOut\n";
}

#実行結果
Pattern ^([0-9]+)(??{"X{$1}"})$
Line1 1XX no match
Line2 2XX matchs 2XX
Line3 3XX no match
Line4 1XXX no match
Line5 2XXX no match
Line6 3XXX matchs 3XXX
Line7 12XXXXXXXXXXX no match
Line8 12XXXXXXXXXXXX matchs 12XXXXXXXXXXXX
Line9 12XXXXXXXXXXXXX no match