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

7-7 括弧問題の準備1

正規表現パズル

行頭直後の開き括弧から、対応する閉じ括弧まで検索する。
括弧のネストは許可する。

擬似括弧として開き括弧をS、閉じ括弧をEとする。

検索前


検索後


対象データ

SE
SESESESE
SSEE
SSSEEE
SSESEESE
SSSSEEEE
SSSESEEE
SSSEESEE
SSESSEEE
SSESESEE
SSEEEEE
SSSEESESEE


正規表現

^S(?<rec>S\g<rec>E\g<rec>|)E

別解

^(?<rec>S(\g<rec>)*E)


解説

詳説正規表現3版135ページに書いてありますが
this|that|
は
(this|that)?
とほぼ同じ意味となります。


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

ConstRegex = Regexp.new('^(?<rec>S(\g<rec>)*E)')
hairetu = Array.new
hairetu.push('SE')
hairetu.push('SESESESE')
hairetu.push('SSEE')
hairetu.push('SSSEEE')
hairetu.push('SSESEESE')
hairetu.push('SSSSEEEE')
hairetu.push('SSSESEEE')
hairetu.push('SSSEESEE')
hairetu.push('SSESSEEE')
hairetu.push('SSESESEE')
hairetu.push('SSEEEEE')
hairetu.push('SSSEESESEE')

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 ^S(?<rec>S\g<rec>E\g<rec>|)E
Line01 SE matchs SE
Line02 SESESESE matchs SE
Line03 SSEE matchs SSEE
Line04 SSSEEE matchs SSSEEE
Line05 SSESEESE matchs SSESEE
Line06 SSSSEEEE matchs SSSSEEEE
Line07 SSSESEEE matchs SSSESEEE
Line08 SSSEESEE matchs SSSEESEE
Line09 SSESSEEE matchs SSESSEEE
Line10 SSESESEE matchs SSESESEE
Line11 SSEEEEE matchs SSEE
Line12 SSSEESESEE matchs SSSEESESEE