てくのろーぐ

新卒エンジニアの日常ログ

Rubyにおけるグローバルマッチング

ruby正規表現を使ったマッチングにはmatchメソッドがありますが、/gオプションがないためグローバルマッチングができない。 scanメソッドはパターンが1つの正規表現の場合はグローバルマッチングとして使えるが下記のようなにグループを使用した場合、グループに含まれていないものはマッチング対象にならない。

text ='グーグル https://www.google.co.jp/ ヤフーhttp://www.yahoo.co.jp/'
p text.scan(%r{(http|https|)://[a-z0-9/.]+[/]?})

[["https"], ["http"]] # 結果

そのため、Rubyでグループを使用するグローバルマッチングを行う際には以下のようにする必要がある。

text ='グーグル https://www.google.co.jp/ ヤフーhttp://www.yahoo.co.jp/'
regex = %r{(http|https|)://[a-z0-9/.]+[/]?}

match_data = []
text.gsub(regex) do |data|
  match_data.push(data)
end
p match_data

["https://www.google.co.jp/", "http://www.yahoo.co.jp/"]  # 結果

追伸

上の正規表現がガバガバなのは仕様です。 rubyでURLを抜き出すときはURI.extractを使うのがいいと思います。