Ruby
プロを目指す人のためのRuby入門

はじめに

この記事は書籍「プロを目指す人のためのRuby入門」に掲載できなかったトピックを著者自らが紹介するアドベントカレンダーの14日目です。
本文に出てくる章番号や項番号は書籍の中で使われている番号です。

今回は正規表現関連の便利メソッドを紹介します。

必要な前提知識

「プロを目指す人のためのRuby入門」の第6章まで読み終わっていること。

正規表現関連の便利メソッド

Regexpクラスにも便利なメソッドがあります。ここでは以下の2つのメソッドを紹介します。

  • Regexp.union
  • Regexp.escapeRegexp.quote

Regexp.union

Regexp.unionメソッドは2つ以上の正規表現をOR条件(|)で連結し、1つの正規表現として返します。

zip_code_regexp = /\d{3}-\d{4}/
phone_number_regexp = /\d+-\d+-\d+/
date_regexp = /\d+年\d+月\d+日/

# 3つの正規表現をOR条件で連結する
regexp = Regexp.union(zip_code_regexp, phone_number_regexp, date_regexp)
#=> /(?-mix:\d{3}-\d{4})|(?-mix:\d+-\d+-\d+)|(?-mix:\d+年\d+月\d+日)/

text = <<-TEXT
郵便番号は123-4567です。
電話番号は03-1234-5678です。
生年月日は1977年7月17日です。
TEXT

text.scan(regexp)
#=> ["123-4567", "03-1234-5678", "1977年7月17日"]

Regexp.escape、Regexp.quote

Regexp.escapeメソッド(エイリアスメソッドはRegexp.quote)は文字列中のメタ文字をバックスラッシュでエスケープして、メタ文字の意味を打ち消します。

# +や*は正規表現のメタ文字なのでエスケープする
pattern = Regexp.escape('1+2=3,2*3=6')
pattern
#=> "1\\+2=3,2\\*3=6"

# 上で作った文字列を変数展開した正規表現を使う
'1+2=3,2*3=6' =~ /#{pattern}/
#=> 0

次回予告

次回はprivateメソッドとインデントのスタイルについて議論します。