Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

Ruby辞典

  1. トップページ
  2. Ruby辞典
  3. Regexp.new / =~ / match / match?

Regexp.new / =~ / match / match?

正規表現によるパターンマッチングの基本構文です。文字列が特定のパターンに一致するかどうかを判定したり、マッチした情報を取得したりします。

構文
# 正規表現リテラル(最も一般的)。
/パターン/
/パターン/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』を返します。
サンプルコード
文字列 = "Hello, Ruby 3.2!"

# =~ でマッチ位置を取得します。
位置 = 文字列 =~ /Ruby/
puts 位置  # 7("Ruby" が始まるインデックス)

puts (文字列 =~ /Python/).inspect  # nil(マッチしない)

# match で MatchData を取得します。
md = 文字列.match(/(\w+)\s+(\d+\.\d+)/)
puts md[0]   # Ruby 3.2(マッチ全体)
puts md[1]   # Ruby(1番目のキャプチャグループ)
puts md[2]   # 3.2(2番目のキャプチャグループ)

# 名前付きキャプチャグループ。
日付文字列 = "2024-03-15"
m = 日付文字列.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 で動的に正規表現を作成します。
検索語 = "Ruby"
パターン = Regexp.new(検索語, Regexp::IGNORECASE)
puts "I love ruby programming".match?(パターン)  # 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』を参照してください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。