BLOGTIMES
2013/10/03

Ruby で正規表現がマッチした場所と文字列を取得する

  ruby  programming  regex 
このエントリーをはてなブックマークに追加

例えば foobarbazfoobarbaz という文字列に対して /foo|baz/ という正規表現マッチさせると foo と bar が2箇所ずつ合計4箇所マッチするわけですが、マッチした文字列とポジションを一緒に取得をする方法が Ruby にはないようだったので書いてみたら意外と面倒だったので、忘れないようにメモ。

ちょっとムダなことをしてるような気がしなくもないですが、一応できました。
どちらも実行すると {0=>"foo", 6=>"baz", 9=>"foo", 15=>"baz"} という感じになります。

for_1_9_or_later.rb

require "enumerator" str = "foobarbazfoobarbaz" pat = /foo|baz/ matches = str.enum_for(:scan, pat).with_object({}){|m, t| t[Regexp.last_match.begin(0)] = m } p matches

1.8.5 だと with_object() が使えないので、こんな感じでしょうか。
そこはかとなくダサイ感じですが、今日のところはこの辺で。

for_1_8.rb

require "enumerator" str = "foobarbazfoobarbaz" pat = /foo|baz/ matches = {} str.enum_for(:scan, pat).each{|m| matches[Regexp.last_match.begin(0)] = m } p matches

    トラックバックについて
    Trackback URL:
    お気軽にどうぞ。トラックバック前にポリシーをお読みください。[policy]
    このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/6182
    Trackbacks
    このエントリにトラックバックはありません
    Comments
    愛のあるツッコミをお気軽にどうぞ。[policy]
    古いエントリについてはコメント制御しているため、即時に反映されないことがあります。
    コメントはありません
    Comments Form

    コメントは承認後の表示となります。
    OpenIDでログインすると、即時に公開されます。

    OpenID を使ってログインすることができます。

    Identity URL: Yahoo! JAPAN IDでログイン