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

7-4 田中哲スペシャルで2度書き防止

正規表現パズル

[123]{2}a[123]{2}を検索する。

検索前


検索後


対象データ

12a31
12aX3
1XaX3
XXaXX
13122


正規表現

[123]{2}a[123]{2}

別解

(?<twice>[123]{2})a\g<twice>


解説

田中哲スペシャルで[123]{2}の2度書きを防いでます。
オートマトンを使い回すので、正規表現のレスポンスもいいそうです。

■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
後方参照と田中哲スペシャルは、似てはいますが、全然違いますので注意。
たとえば、
[123]{2}a[123]{2}
は、下記の2つにマッチします。
33a33
12a31

しかし
([123]{2})a\1
は、
33a33にはマッチしますが、
12a31にはマッチしません。


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

ConstRegex = Regexp.new('^(?<twice>[123]{2})a\g<twice>')
hairetu = Array.new
hairetu.push('12a31')
hairetu.push('12aX3')
hairetu.push('1XaX3')
hairetu.push('XXaXX')
hairetu.push('13122')

puts "Pattern #{ConstRegex.source}"
for i in (0..hairetu.length-1)
    willOut = "Line#{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 ^(?<twice>[123]{2})a\g<twice>
Line1 12a31 matchs 12a31
Line2 12aX3 no match
Line3 1XaX3 no match
Line4 XXaXX no match
Line5 13122 no match