文字列.scan / match / =~
| 対応: | Ruby 1.8(2003) |
|---|
文字列に対して正規表現を使ってパターン検索を行うメソッドです。全マッチを配列で取得したり、MatchDataオブジェクトで詳細情報を取得したりできます。
構文
# パターンにマッチした文字列をすべて配列で返します
文字列.scan(/パターン/)
文字列.scan(/パターン/) { |マッチ| 処理 }
# 最初のマッチの MatchData を返します(マッチしない場合は nil)
文字列.match(/パターン/)
文字列.match(/パターン/, 開始位置)
# マッチした位置を返します(=~ と同じ)
文字列 =~ /パターン/
メソッド一覧
| メソッド | 概要 |
|---|---|
| scan(pattern) | パターンにマッチする部分文字列をすべて配列で返します。キャプチャグループがある場合は配列の配列を返します。 |
| scan(pattern) { |m| } | マッチするたびにブロックを呼び出します。 |
| match(pattern) | 最初にマッチした位置のMatchDataを返します。マッチしない場合は『nil』を返します。 |
| match(pattern, pos) | pos番目の文字から検索を開始します。 |
| =~ | マッチした最初の位置(整数)または『nil』を返します。 |
サンプルコード
sample_string_scan_match.rb
text = "Rubyは1995年に生まれ、バージョン3.2が2022年にリリースされました。"
# scan で数字をすべて抽出します
digits = text.scan(/\d+/)
puts digits.inspect # ["1995", "3", "2", "2022"]
# キャプチャグループを使って年と月を分けて取得します
date_str = "予定: 2024-01-15, 2024-03-20, 2024-06-01"
date_list = date_str.scan(/(\d{4})-(\d{2})-(\d{2})/)
puts date_list.inspect
# [["2024", "01", "15"], ["2024", "03", "20"], ["2024", "06", "01"]]
# ブロックを使って処理します
puts "マッチした日付:"
date_str.scan(/\d{4}-\d{2}-\d{2}/) { |date| puts " #{date}" }
# match で最初のマッチの詳細情報を取得します
# 『\1』は正規表現内で最初のグループ(括弧内)にマッチした内容を再利用する後方参照です
html = "<h1>タイトル</h1>"
m = html.match(/<(\w+)>(.+?)<\/\1>/)
if m
puts "タグ: #{m[1]}" # タグ: h1
puts "内容: #{m[2]}" # 内容: タイトル
end
# match で開始位置を指定します
str = "kiryu majima kiryu akiyama"
m1 = str.match(/kiryu/)
puts m1[0] # kiryu(最初のマッチ)
m2 = str.match(/kiryu/, 6)
puts m2[0] # kiryu(6文字目以降から検索)
puts m2.begin(0) # 13(2番目の kiryu の位置)
string_scan_match.rb
ruby string_scan_match.rb ["1995", "3", "2", "2022"] [["2024", "01", "15"], ["2024", "03", "20"], ["2024", "06", "01"]] マッチした日付: 2024-01-15 2024-03-20 2024-06-01 タグ: h1 内容: タイトル kiryu kiryu 13
概要
『scan』はすべてのマッチを一度に取得したいときに使います。キャプチャグループなしの場合は文字列の配列、キャプチャグループありの場合は配列の配列を返します。これを利用してデータ抽出に活用できます。
『match』は最初のマッチだけが必要な場合や、マッチ位置・前後の文字列など詳細情報が必要な場合に使います。戻り値の『MatchData』には『begin(n)』(マッチ開始位置)、『end(n)』(マッチ終了位置)、『pre_match』、『post_match』などのメソッドがあります。
HTMLやXMLのパースに正規表現を使うことは推奨されません。入れ子構造や属性の順序など、正規表現では正確に処理できないケースが多くあります。HTMLのパースには専用のライブラリ(Nokogiriなど)を使用してください。
正規表現の基本構文については『Regexp.new / =~ / match』を、文字列の置換には『文字列.sub / gsub』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。