トップページに戻る
次の正規表現パズルへ
前の正規表現パズルへ
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