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

7-5 田中哲スペシャルで^[0-9]+$を模倣

正規表現パズル

田中哲スペシャルで
^[0-9]+$
を模倣する。

検索前


検索後


対象データ

111
313
433
123
234
aaaa
a123
a
0000000000


正規表現

^(?<cap>[0-9]\g<cap>|[0-9])$

別解

^(?<cap>[0-9]\g<cap>|[0-9]$)

別解

^(?<rec>[0-9](\g<rec>)*)$


解説

再帰レベル0なら ^[0-9]$
再帰レベル1なら ^[0-9][0-9]$
再帰レベル2なら ^[0-9][0-9][0-9]$
再帰レベル3なら ^[0-9][0-9][0-9][0-9]$
再帰レベル4なら ^[0-9][0-9][0-9][0-9][0-9]$
以下略

といった感じで正規表現を考えると分かりやすいかもしれません。


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

ConstRegex = Regexp.new('^(?<rec>[0-9](\g<rec>)*)$')
hairetu = Array.new
hairetu.push('111')
hairetu.push('313')
hairetu.push('433')
hairetu.push('123')
hairetu.push('234')
hairetu.push('aaaa')
hairetu.push('a123')
hairetu.push('a')
hairetu.push('0000000000')

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 ^(?<cap>[0-9]\g<cap>|[0-9]$)
Line1 111 matchs 111
Line2 313 matchs 313
Line3 433 matchs 433
Line4 123 matchs 123
Line5 234 matchs 234
Line6 aaaa no match
Line7 a123 no match
Line8 a no match
Line9 0000000000 matchs 0000000000