- blogs:
- cles::blog
2013/10/03

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



例えば 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 を使ってログインすることができます。
サイト内検索
検索ワードランキング
へぇが多いエントリ
閲覧数が多いエントリ
1 . アーロンチェアのポスチャーフィットを修理(111998)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110627)
3 . 年次の人間ドックへ(110257)
4 . 2023 年分の確定申告完了!(1つめ)(109805)
5 . 三菱鉛筆がラミーを買収(109703)
2 . 福岡銀がデマの投稿者への刑事告訴を検討中(110627)
3 . 年次の人間ドックへ(110257)
4 . 2023 年分の確定申告完了!(1つめ)(109805)
5 . 三菱鉛筆がラミーを買収(109703)
cles::blogについて
Referrers