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

8-4 回文問題

正規表現パズル

回文な行を検索する。

Perl正規表現雑技の「回文にマッチする正規表現」を参考にさせていただきました。


対象データ

abc
abbb
ddd
dddd
abccba
abcba
abcdedcba
11
111
1111
tomato
racecar
wasitabarorabatisaw
abcdeffedcba
abcdefghijk
abcdefedcba


正規表現

^(.+).?(??{reverse $1})$


解説

動的正規表現構文で
後方参照とreverse関数を組み合わせてます。


Perlでのソースと実行結果

use re 'eval';
$ConstRegex = '^(.+).?(??{reverse $1})$';
@hairetu = ();
push(@hairetu,'abc');
push(@hairetu,'abbb');
push(@hairetu,'ddd');
push(@hairetu,'dddd');
push(@hairetu,'abccba');
push(@hairetu,'abcba');
push(@hairetu,'abcdedcba');
push(@hairetu,'11');
push(@hairetu,'111');
push(@hairetu,'1111');
push(@hairetu,'tomato');
push(@hairetu,'racecar');
push(@hairetu,'wasitabarorabatisaw');
push(@hairetu,'abcdeffedcba');
push(@hairetu,'abcdefghijk');
push(@hairetu,'abcdefedcba');

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 ^(.+).?(??{reverse $1})$
Line1 abc no match
Line2 abbb no match
Line3 ddd matchs ddd
Line4 dddd matchs dddd
Line5 abccba matchs abccba
Line6 abcba matchs abcba
Line7 abcdedcba matchs abcdedcba
Line8 11 matchs 11
Line9 111 matchs 111
Line10 1111 matchs 1111
Line11 tomato no match
Line12 racecar matchs racecar
Line13 wasitabarorabatisaw matchs wasitabarorabatisaw
Line14 abcdeffedcba matchs abcdeffedcba
Line15 abcdefghijk no match
Line16 abcdefedcba matchs abcdefedcba