Regexp.new / =~ / match / match?
| 対応: | Ruby 1.8(2003) |
|---|
正規表現によるパターンマッチングの基本構文です。文字列が特定のパターンに一致するかどうかを判定したり、マッチした情報を取得したりします。
構文
# 正規表現リテラル(最も一般的)。
/パターン/
/パターン/i # 大文字小文字を無視します。
/パターン/m # . が改行にもマッチします。
# Regexp クラスで正規表現を動的に生成します。
Regexp.new("パターン")
Regexp.new("パターン", Regexp::IGNORECASE)
# =~ 演算子: マッチした位置を返します(マッチしない場合は nil)。
文字列 =~ /パターン/
/パターン/ =~ 文字列
# match メソッド: MatchData オブジェクトを返します。
文字列.match(/パターン/)
/パターン/.match(文字列)
# match? メソッド: マッチするか真偽値で返します(Ruby 2.4+)。
文字列.match?(/パターン/)
# !~ 演算子: マッチしない場合に true を返します。
文字列 !~ /パターン/
メソッド一覧
| メソッド / 演算子 | 概要 |
|---|---|
| Regexp.new(str) | 文字列から正規表現オブジェクトを動的に生成します。 |
| =~ | マッチした最初の位置(0始まり)を返します。マッチしない場合は『nil』を返します。 |
| match(pattern) | MatchDataオブジェクトを返します。キャプチャグループへのアクセスに便利です。 |
| match?(pattern) | マッチするかどうかを『true/false』で返します。MatchDataを生成しない分高速です。 |
| !~ | マッチしない場合に『true』を返します。 |
サンプルコード
sample_regexp_match.rb
str = "Hello, Ruby 3.2!"
# =~ でマッチ位置を取得します。
pos = str =~ /Ruby/
puts pos # 7("Ruby" が始まるインデックス)
puts (str =~ /Python/).inspect # nil(マッチしない)
# match で MatchData を取得します。
md = str.match(/(\w+)\s+(\d+\.\d+)/)
puts md[0] # Ruby 3.2(マッチ全体)
puts md[1] # Ruby(1番目のキャプチャグループ)
puts md[2] # 3.2(2番目のキャプチャグループ)
# 以下は発展的な使い方です。
# 名前付きキャプチャグループ。
date_str = "2024-03-15"
m = date_str.match(/(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/)
puts m[:year] # 2024
puts m[:month] # 03
puts m[:day] # 15
# match? で単純な判定(MatchData を生成しない分高速)。
puts "test@example.com".match?(/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i) # true
puts "not-an-email".match?(/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i) # false
# Regexp.new で動的に正規表現を作成します。
keyword = "Ruby"
pattern = Regexp.new(keyword, Regexp::IGNORECASE)
puts "I love ruby programming".match?(pattern) # true
ruby regexp_match.rb 7 nil Ruby 3.2 Ruby 3.2 2024 03 15 true false true
概要
Rubyの正規表現は言語に深く統合されており、リテラル記法(『/パターン/』)で簡潔に書けます。『=~』演算子の戻り値はマッチ位置(整数)またはnilで、条件式に直接使えます(nilはfalsy、整数はtruthy)。
『match』メソッドが返す『MatchData』オブジェクトには、マッチした文字列全体(『[0]』)やキャプチャグループ(『[1]』『[2]』...)、名前付きキャプチャ(『[:name]』)でアクセスできます。マッチした前後の文字列は『pre_match』『post_match』で取得できます。
ユーザー入力をそのまま『Regexp.new』に渡すと、意図しない正規表現や『ReDoS』(正規表現によるサービス停止攻撃)のリスクがあります。動的に正規表現を作成する場合は必ず『Regexp.escape』でエスケープしてください。
文字列全体を正規表現で検索する場合は『文字列.scan / match』を、文字列の置換には『文字列.sub / gsub』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。