Rubyでプログラミングをしていると、文字列の中から特定のパターンを見つけ出したり、一括で置換したりしたい場面が必ず訪れます。
例えば、以下のような場面です。
- 入力された値が、電話番号や郵便番号のフォーマットに合っているか検証したい
- 文章の中から、URLやメールアドレスだけをすべて抜き出したい
- HTMLタグをすべて取り除いて、プレーンなテキストにしたい
このような複雑な文字列操作を、驚くほど簡潔に実現してくれるのが「正規表現」です。
一見すると、謎の記号の羅列に見えるかもしれませんが、そのルールを一度理解してしまえば、コードをより強力で洗練されたものに変えることができます。
この記事では、Rubyにおける正規表現の基本から、実務で頻出する主要なメソッドの使い方、そしてコピペしてすぐに使える実践的なサンプルコードまで、徹底的に解説していきます。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 657,000円 (最大約53万円の給付金が適用される) |
|
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
Rubyにおける正規表現の基本
まずは、正規表現がどのようなものか、基本的な書き方と、パターンを構成する特殊な文字(メタ文字)について見ていきましょう。
正規表現の書き方
Rubyでは、正規表現は2つのスラッシュ/
で囲んで記述するのが一般的です。
/パターン/
例えば、文字列の中にRuby
という単語があるかどうかを調べる正規表現は/Ruby/
と書きます。
よく使うメタ文字(特殊文字)一覧
正規表現の真価は、「メタ文字」と呼ばれる特殊な意味を持つ記号を使いこなすことで発揮されます。
これらのメタ文字自体を文字として検索したい場合は、直前にバックスラッシュ\
を置いてエスケープします。(例: /\./
はドット.
そのものに一致)
ここでは、最低限覚えておきたい、使用頻度の高いメタ文字を紹介します。
メタ文字 | 意味 | 例 |
---|---|---|
. |
デフォルトでは改行を除く任意の一文字 (m オプションで改行も含む) |
/R.by/ は Ruby , Roby などに一致 |
* |
直前の文字の0回以上の繰り返し | /Ru*by/ は Rby , Ruby , Ruuuby に一致 |
+ |
直前の文字の1回以上の繰り返し | /Ru+by/ は Ruby , Ruuuby に一致 |
? |
直前の文字の0回または1回の出現 | /Ru?by/ は Rby , Ruby に一致 |
\d |
任意の半角数字([0-9] と同じ) |
/\d\d\d/ は 123 などに一致 |
\s |
空白文字(スペース, \t , \n , \r , \f , \v ) |
/Hello\sWorld/ は Hello World に一致 |
\w |
英数字とアンダースコア(Unicode文字にもマッチする場合がある) | /\w+/ は Ruby123 , _ruby , ルビー に一致 |
[] |
角括弧内のいずれかの一文字 | /[abc]/ は a , b , c のいずれかに一致 |
^ |
行の先頭 | /^Ruby/ は各行の先頭のRuby に一致 |
$ |
行の末尾 | /Ruby$/ は各行の末尾のRuby に一致 |
() |
グループ化。後方参照や部分的な取り出しに使う | `/(Ruby |
\A |
文字列全体の先頭 | /\AHello/ は文字列全体の先頭のHello にのみ一致 |
\z |
文字列全体の末尾 | /world\z/ は文字列全体の末尾のworld にのみ一致 |
注意点: 「行」の先頭・末尾と「文字列」の先頭・末尾の違い
Rubyの正規表現を扱う上で、^
, $
と\A
, \z
の違いを理解することは非常に重要です。
^
,$
:改行を含む複数行の文字列の場合、それぞれの「行の先頭」と「行の末尾」にマッチします。\A
,\z
:改行の有無にかかわらず、常に「文字列全体の先頭」と「文字列全体の末尾」にのみマッチします。
この挙動の違いをコードで確認してみましょう。
text = "hello\nworld\nhello"
# ^ は「行頭」にマッチするため、2行目の"world"にもマッチする
puts text.match?(/^hello/) #=> true
puts text.match?(/^world/) #=> true
# \A は「文字列全体の先頭」にしかマッチしない
puts text.match?(/\Ahello/) #=> true
puts text.match?(/\Aworld/) #=> false
他の言語と異なり、Rubyではm
(マルチライン)オプションは.
(ドット)が改行にマッチするかどうかに影響するもので、^
や$
の挙動は変わりません。
意図しないマッチを防ぐためにも、「文字列の”全体”」を対象としたい場合は\A
と\z
を使う、と覚えておくのが安全です。
Rubyの主要な正規表現メソッド
正規表現のパターンが書けたら、次はそのパターンを使って文字列を操作します。
Rubyには、正規表現のための便利なメソッドが標準で用意されています。
ここでは、特に重要な4つのメソッドmatch
, scan
, sub
, gsub
を詳しく見ていきましょう。
match / match? : 文字列がパターンに一致するか調べる
match
メソッドは、文字列が正規表現に一致するかどうかを調べる最も基本的なメソッドです。
text = "私の郵便番号は123-4567です。"
pattern = /\d{3}-\d{4}/
# matchメソッドで調べる
match_data = text.match(pattern)
if match_data
puts "郵便番号が見つかりました: #{match_data[0]}"
else
puts "郵便番号は見つかりませんでした。"
end
実行結果は以下の通りです。
郵便番号が見つかりました: 123-4567
\d{3}
は「数字が3回」、\d{4}
は「数字が4回」を意味します。
match
メソッドは、一致した部分が見つかればMatchData
というオブジェクトを返し、見つからなければnil
を返します。
MatchData
オブジェクトからは、[0]
で一致した文字列全体を取り出すことが可能です。
また、単に一致するかどうか(true
かfalse
か)だけを知りたい場合は、より高速なmatch?
メソッドを使うと良いでしょう。
text = "電話番号は090-1234-5678です。"
if text.match?(/\d{3}-\d{4}-\d{4}/)
puts "電話番号のフォーマットです。"
end
scan : 一致した部分をすべて配列で取得する
scan
メソッドは、文字列の中から正規表現に一致する部分をすべて探し出し、配列として返してくれます。
text = "連絡先は support@example.com と sales@example.jp です。"
pattern = /[\w.\-]+@[\w.\-]+/
# scanメソッドでメールアドレスをすべて抽出
emails = text.scan(pattern)
p emails
実行結果は以下の通りです。
["support@example.com", "sales@example.jp"]
このように、文章中から特定のパターンの文字列を根こそぎ抜き出したい場合に非常に便利です。
sub / gsub : 一致した部分を置換する
sub
とgsub
は、正規表現に一致した部分を別の文字列に置き換えるためのメソッドです。
sub
: 最初に見つかった1箇所だけを置換するgsub
: 見つかったすべてを置換する (g
はGlobalの意)
text = "Ruby, Python, Ruby, Java"
# sub: 最初の"Ruby"だけを置換
puts text.sub(/Ruby/, "Go")
# gsub: すべての"Ruby"を置換
puts text.gsub(/Ruby/, "Go")
実行結果は以下の通りです。
Go, Python, Ruby, Java
Go, Python, Go, Java
さらに、gsub
は後方参照と組み合わせることで、より強力な置換が可能になります。
後方参照とは、正規表現の中で()
でグループ化した部分を、置換後の文字列で\1
, \2
のように参照する機能です。
例えば、YYYY-MM-DD
という形式の日付をYYYY/MM/DD
形式に変換してみましょう。
date_str = "2025-10-13"
pattern = /(\d{4})-(\d{2})-(\d{2})/
# 後方参照を使ってフォーマットを変換
new_date_str = date_str.gsub(pattern, '\1/\2/\3')
puts new_date_str
実行結果は以下の通りです。
2025/10/13
()
で囲まれた1番目のグループ(年)が\1
に、2番目(月)が\2
に、3番目(日)が\3
に対応します。
これにより、元の文字列の一部を再利用しながら、柔軟な置換が実現できるのです。
Rubyにおける実践的な正規表現サンプルコード
最後に、これまでの知識を組み合わせた、より実践的なサンプルコードをいくつか紹介します。
電話番号からハイフンを削除する
ユーザー入力などでハイフンの有無が統一されていない電話番号を、数字だけに整形する例です。
phone_number = "090-1234-5678"
# ハイフンを空文字に置換する
formatted_number = phone_number.gsub(/-/, "")
puts formatted_number
実行結果は以下の通りです。
09012345678
HTMLタグを削除する
Webスクレイピングなどで取得したHTMLから、タグだけをすべて取り除いて本文テキストを抽出します。
html = "<p>これは<strong>重要</strong>なテキストです。</p>"
# タグに一致する正規表現で、空文字に置換
plain_text = html.gsub(/<.*?>/, "")
puts plain_text
実行結果は以下の通りです。
これは重要なテキストです。
<.*?>
というパターンがポイントです。
.
は任意の一文字、*
は0回以上の繰り返しなので、<
と>
に囲まれた部分に一致します。
最後の?
は「最短マッチ」を意味し、これがないと最初の<
から最後の>
までがすべて一致してしまうため、意図した結果になりません。
まとめ
Rubyにおける正規表現の基本から、match
, scan
, sub
, gsub
といった主要メソッドの使い方、そして実践的なサンプルコードまでを紹介しました。
なお、Rubyを体系的に学んだり、Rubyのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。
特にRuby+Railsを学ぶ場合は、群を抜いて評判の良い「RUNTEQ」を強くおすすめします。