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

7-8 括弧問題の準備2

正規表現パズル

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

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

検索前


検索後


対象データ

StaEnd
StaEndStaEndStaEndStaEnd
StaStaEndEnd
StaStaStaEndEndEnd
StaStaEndStaEndEndStaEnd
StaStaStaStaEndEndEndEnd
StaStaStaEndStaEndEndEnd
StaStaStaEndEndStaEndEnd
StaStaEndStaStaEndEndEnd
StaStaEndStaEndStaEndEnd
StaStaEndEndEndEndEnd
StaStaStaEndEndStaEndStaEndEnd


正規表現

^Sta(?<rec>Sta\g<rec>End\g<rec>|)End

別解

^(?<rec>Sta(\g<rec>)*End)


解説

前問は、文字Sと文字Eだったのに対し
本問は、文字列Staと文字Endですが
正規表現に大きな変化はありません。


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

ConstRegex = Regexp.new('^(?<rec>Sta(\g<rec>)*End)')
hairetu = Array.new
hairetu.push('StaEnd')
hairetu.push('StaEndStaEndStaEndStaEnd')
hairetu.push('StaStaEndEnd')
hairetu.push('StaStaStaEndEndEnd')
hairetu.push('StaStaEndStaEndEndStaEnd')
hairetu.push('StaStaStaStaEndEndEndEnd')
hairetu.push('StaStaStaEndStaEndEndEnd')
hairetu.push('StaStaStaEndEndStaEndEnd')
hairetu.push('StaStaEndStaStaEndEndEnd')
hairetu.push('StaStaEndStaEndStaEndEnd')
hairetu.push('StaStaEndEndEndEndEnd')
hairetu.push('StaStaStaEndEndStaEndStaEndEnd')

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 ^Sta(?<rec>Sta\g<rec>End\g<rec>|)End
Line01 StaEnd matchs StaEnd
Line02 StaEndStaEndStaEndStaEnd matchs StaEnd
Line03 StaStaEndEnd matchs StaStaEndEnd
Line04 StaStaStaEndEndEnd matchs StaStaStaEndEndEnd
Line05 StaStaEndStaEndEndStaEnd matchs StaStaEndStaEndEnd
Line06 StaStaStaStaEndEndEndEnd matchs StaStaStaStaEndEndEndEnd
Line07 StaStaStaEndStaEndEndEnd matchs StaStaStaEndStaEndEndEnd
Line08 StaStaStaEndEndStaEndEnd matchs StaStaStaEndEndStaEndEnd
Line09 StaStaEndStaStaEndEndEnd matchs StaStaEndStaStaEndEndEnd
Line10 StaStaEndStaEndStaEndEnd matchs StaStaEndStaEndStaEndEnd
Line11 StaStaEndEndEndEndEnd matchs StaStaEndEnd
Line12 StaStaStaEndEndStaEndStaEndEnd matchs StaStaStaEndEndStaEndStaEndEnd