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

7-11 回文な行を検索(偶数文字限定)

正規表現パズル

偶数文字の回文の行を検索する。

検索前


検索後


対象データ

abc
abbb
ddd
dddd
abccba
abcba
abcdedcba
11
111
1111
NISIN
NISSIN


正規表現

^(?<rec>(?<cap>.)(\g<rec>)?\k<cap+0>)$


解説

この正規表現なら、
再帰Level0の正規表現
再帰Level1の正規表現
再帰Level2の正規表現
再帰Level3の正規表現
を脳内でイメージするのがよさそうです。

「正規表現」に無限のパワーを与える田中哲スペシャル


#Rubyでのソースと実行結果

wStr = '^(?<rec>(?<cap>.)(\g<rec>)?\k<cap+0>)$'
ConstRegex = Regexp.new(wStr)
hairetu = Array.new
hairetu.push('abc')
hairetu.push('abbb')
hairetu.push('ddd')
hairetu.push('dddd')
hairetu.push('abccba')
hairetu.push('abcba')
hairetu.push('abcdedcba')
hairetu.push('11')
hairetu.push('111')
hairetu.push('1111')
hairetu.push('NISIN')
hairetu.push('NISSIN')

puts "Pattern #{ConstRegex.source}"
for i in (0..hairetu.length-1)
    willOut = sprintf("Line%02d",i+1) + " #{hairetu[i]} "
    work = ConstRegex.match(hairetu[i]).to_a[0]
    if work then
        willOut += 'matchs ' + work
    else
        willOut += 'no match'
    end
    puts willOut
end

#実行結果
Pattern ^(?<rec>(?<cap>.)(\g<rec>)?\k<cap+0>)$
Line01 abc no match
Line02 abbb no match
Line03 ddd no match
Line04 dddd matchs dddd
Line05 abccba matchs abccba
Line06 abcba no match
Line07 abcdedcba no match
Line08 11 matchs 11
Line09 111 no match
Line10 1111 matchs 1111
Line11 NISIN no match
Line12 NISSIN matchs NISSIN