【Ruby】Lesson5-06|正規表現を理解しよう

ながみえ

一つ前のページではprivateメソッドについて学習しました。

今回は 正規表現 について見ていきましょう。

Lesson1:基礎文法編
Lesson2:制御構造編
Lesson3:メソッド編
Lesson4:コレクション編
Lesson5:オブジェクト指向編

 ・Lesson5-1:クラスの基本を理解しよう
 ・Lesson5-2:イニシャライザを理解しよう
 ・Lesson5-3:アクセスメソッドを理解しよう
 ・Lesson5-4:クラス変数とクラスメソッドを理解しよう
 ・Lesson5-5:privateメソッドを理解しよう
 ・Lesson5-6:正規表現を理解しよう ◁今回はココ
 ・Lesson5-7:クラスの継承を理解しよう
 ・Lesson5-8:オーバーライドを理解しよう
 ・Lesson5-9:モジュールを使ってみよう
 ・Lesson5-10:ミックスインを使ってみよう
 ・Lesson5-11:ファイル操作を理解しよう
 ・確認問題5-☆1:モンスター捕獲ゲームを作ろう
 ・確認問題5-☆2:モンスターとの戦闘ゲームを作ろう
 ・確認問題5-☆3:マルバツゲームを作ろう

<<前のページ

Rubyの記事一覧

次のページ>>

正規表現とは何か?|文字列のパターンマッチ記法

正規表現 は「文字列のパターンマッチ(検索・置換など)」に使われる特別な記法です。

プログラム内で文字列を扱う際、特定のパターンに合致する部分を見つけたり、編集したりするために使われます。

正規表現の概要と使用コード例

正規表現(Regular Expression)は「文字列のパターン」を定義する方法です。

たとえば「数字だけの文字列」や「特定の単語を含む文章」などを簡単に見つけることができます。

Rubyでは正規表現を//(スラッシュ)で囲んで記述します。

  • /abc/ と書くと「abc」という文字列パターンにマッチ
  • 「Ruby」という単語を探すなら /Ruby/ と書く

正規表現専用の記号やメタ文字(例: . * + ? [] ^ $ など)を使って複雑な条件指定が可能であり、文字列操作メソッド(=~, match, scan, gsub など)と組み合わせて使います。

以下のコードを見てみましょう。

text = "I love Ruby!"

if text =~ /Ruby/	#もしtextの中にRubyという文字列があるなら
  puts "Rubyという文字が見つかりました!"
end

このコードでは/Ruby/が文字列"I love Ruby!"の中から「Ruby」を探します。

=~」はマッチ演算子といい、文字列が正規表現パターンに一致するかどうかを調べるために使われます。

文字列操作メソッドの意味と使用コード一覧

よく使われる文字列操作メソッドの一覧と使用例を以下にまとめます。

メソッド意味・用途返り値例・ポイント
=~マッチ演算子
パターンに合えばインデックス(位置)を返す
インデックス(数値)またはnil
主に「存在判定」に使う
matchマッチ詳細取得
パターンに合う部分の情報を得る
MatchDataオブジェクトまたはnil
グループ抽出もできる
scan全マッチ抽出
すべての一致部分を配列で取得
マッチした部分文字列の配列
繰り返しに便利
gsub全置換
一致部分をすべて別の文字列に置き換え
置換後の新しい文字列
パターンすべてが変わる

コード内での使用例は以下の通りです。

text = "dog, cat, dog"

# =~(マッチ演算子)の使用例
puts text =~ /cat/		# catは文字列の中にある。インデックス5から始まるので出力は5
puts text =~ /fox/		# foxは文字列の中にない。出力はnil

# match(詳細取得)の使用例
result = text.match(/cat/)	# catは文字列の中にある。一致部分の情報(MatchDataオブジェクト)を返す
p result					# 出力は<MatchData "cat">
							# catが無かったら出力はnil

# scan(すべて抽出)の使用例
p text.scan(/dog|cat/)		# text 内に「dog」または「cat」が何回現れるかを調べ、すべて配列で返す。
							# 出力は["dog", "cat", "dog"]
p text.scan(/dog/)			# 出力は["dog", "dog"]

# gsub(すべて置換)の使用例
puts text.gsub(/dog/, "fox") # text 内の「dog」をすべて「fox」に置き換え、新しい文字列を返す。
							 # 出力は"fox, cat, fox"

=~は主に真偽判定やインデックス取得、matchは一致部分の内容確認やグループ化、scanは繰り返し抽出、gsubは一括置換と使い分けます

また、どのメソッドも元のtextは変更されません(破壊的変更ではない)。新しい値・オブジェクトを返します。

if文の真偽の判定基準

一つ前の章で紹介したコードをもう一度見てみましょう。

text = "I love Ruby!"

if text =~ /Ruby/	#もしtextの中にRubyという文字列があるなら
  puts "Rubyという文字が見つかりました!"
end

3行目の「text =~ /Ruby/」の部分はインデックス番号7となるため、このif文は以下のコードと同義です。

if 7
  puts "Rubyという文字が見つかりました!"
end

if文はfalseやnilをとして扱い、7のような数値はとして扱われるため、この条件式は満たされ、コードが実行されます。

よく使われる正規表現記号の意味と使用コード一覧

正規表現にはいくつかの「特殊な記号」があり、これらを使うことでより柔軟な検索が可能になります。

これらを今ここで全て覚える必要はありません。

どんなものがあるかを知っておき、必要になったときに調べるようにしましょう。

記号意味
.任意の1文字(改行以外)a.c ⇒「abc」「a1c」など
\d数字(0~9)\d\d ⇒「23」「07」など
\w英数字やアンダースコア\w+ ⇒「abc」「A_1」など
*直前の文字が0回以上bo* ⇒「b」「bo」「boo」
+直前の文字が1回以上go+ ⇒「go」「goo」
?直前の文字が0回または1回colou?r ⇒「color」「colour」
[ ]括弧内のいずれか1文字[aeiou] ⇒母音1文字にマッチ

これらの記号の簡単な使用例を一つずつ見ていきます。

1. .(任意の1文字)

# 2文字目が何でもいい「a c」にマッチ
puts "abc" =~ /a.c/		# => 0(マッチ)
puts "ac"  =~ /a.c/		# => nil(マッチしない)
puts "cba_a-c" =~ /a.c/	# => 4(マッチ)

2. \d(数字)

# 1つ目の数値のインデックス
puts "123" =~ /\d/		# => 0(「1」にマッチ)
puts "year2025" =~ /\d/	# => 4(「2」にマッチ)
puts "ruby"    =~ /\d/	# => nil

3. \w(英数字やアンダースコア)

# 英数字・アンダースコア1文字にマッチ
puts "_id" =~ /\w/	# => 0(「_」にマッチ)
puts "@@@@" =~ /\w/	# => nil

4. *(直前の文字が0回以上の繰り返し)

# lの後にoが0回以上続く
puts "l"    =~ /lo*/		# => 0(マッチ。「l」)
puts "lo"   =~ /lo*/		# => 0(マッチ。「lo」)
puts "loo"  =~ /lo*/		# => 0(マッチ。「loo」)
puts "aaaloaaa"  =~ /lo*/   # => 3(マッチ。「lo」)
puts "ooo"    =~ /lo*/   	# => nil(マッチしない)

5. +(直前の文字が1回以上の繰り返し)

# gの後にoが1回以上続く
puts "g"    =~ /go+/		# => nil(マッチしない)
puts "goo"  =~ /go+/		# => 0(マッチ。「goo」)
puts "go"   =~ /go+/		# => 0(マッチ。「go」)
puts "aaagoaaa"  =~ /lo*/	# => 3(マッチ。「go」)
puts "ooo"    =~ /lo*/		# => nil(マッチしない)

6. ?(0回または1回)

# color/colour両対応(oの後にuがあっても無くても)
puts "color"   =~ /colou?r/	# => 0(マッチ)
puts "colour"  =~ /colou?r/	# => 0(マッチ)
puts "colr"    =~ /colou?r/	# => nil

7. [ ](いずれか1文字)

# [abc]はaかbかcにマッチ
puts "apple"  =~ /[abc]/  # => 0(「a」にマッチ)
puts "boy"    =~ /[abc]/  # => 0(「b」にマッチ)
puts "dog"    =~ /[abc]/  # => nil

まとめ|Rubyで正規表現を使いこなすために

正規表現を使えば文字列を探したり、置き換えたりする作業をとても簡単にできます。

最初は基本的な例から始め、少しずつ慣れていきましょう!

練習問題|正規表現でメールアドレスをチェックしよう

正規表現をしっかりと身に着けるため、練習問題に挑戦しましょう。

メールアドレス検証プログラムを作成しよう

メールアドレスが正しい形式かどうかを検証するプログラムを作成しましょう。

正規表現を使用し、ユーザーから入力されたメールアドレスが有効な形式かを判定します。

結果は「有効なメールアドレスです」または「無効なメールアドレスです」と表示されるようにします。

以下の要件に従ってコードを完成させてください。

  • メールアドレスの形式を正規表現で定義し、そのパターンに合致するかどうかを確認すること。
  • ユーザーからメールアドレスを入力してもらうこと。
  • 正規表現を使って、メールアドレスが有効かどうかを判定するメソッドを作成すること。
  • メールアドレスが有効な場合には「有効なメールアドレスです」と表示し、無効な場合には「無効なメールアドレスです」と表示すること。

ただし、以下のような実行結果となること。

メールアドレスを入力してください:
test@example.com
有効なメールアドレスです
メールアドレスを入力してください:
aaaaa
無効なメールアドレスです

【ヒント】自力で解くのが難しい人へ

1からコードを組み立てることが難しい場合は、以下のヒントを開いて参考にしましょう。

Q
ヒント1【コードの構成を見る】

正解のコードは上から順に以下のような構成となっています。

1:メソッドvalidate_emailの定義
  □ 正規表現パターンを変数regexに代入
  □ if文でemailがregexにマッチするかを判定
  □ □ 真の場合、「有効なメールアドレスです」と出力
  □ □ else文
  □ □ □ 偽の場合、「無効なメールアドレスです」と出力
2:「メールアドレスを入力してください:」と出力
3:ユーザーの入力を取得し、chompメソッドで改行を削除して変数input_emailに代入
4:メソッドvalidate_emailを呼び出し、引数にinput_emailを渡す

Q
ヒント2【穴埋め問題にする】

以下のコードをコピーし、コメントに従ってコードを完成させて下さい。

# メールアドレスを検証するメソッドの定義
def validate_email(email)
  # メールアドレスの正規表現パターン
  regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  # 正規表現を使ってメールアドレスを検証
=begin
  【穴埋め問題1】
  ここにif文を使って、正規表現がマッチした場合に「有効なメールアドレスです」を出力し、
  そうでない場合に「無効なメールアドレスです」を出力するコードを書いてください。
=end
end

# ユーザーからの入力を受け取る
puts "メールアドレスを入力してください:"
input_email = gets.chomp

=begin
【穴埋め問題2】
ここでvalidate_emailメソッドを呼び出し、ユーザーが入力したメールアドレスを引数として渡してください。
=end

このヒントを見てもまだ回答を導き出すのが難しいと感じる場合は、先に正解のコードと解説を見て内容を理解するようにしましょう。

この問題の解答例と解説

この問題の正解コードとその解説は以下の通りです。

クリックして開いて確認してください。

Q
正解コード
# メールアドレスを検証するメソッドの定義
def validate_email(email)
  # メールアドレスの正規表現パターン
  regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  # 正規表現を使ってメールアドレスを検証
  if email.match?(regex)
    # 有効なメールアドレスの場合
    puts "有効なメールアドレスです"
  else
    # 無効なメールアドレスの場合
    puts "無効なメールアドレスです"
  end
end

# ユーザーからの入力を受け取る
puts "メールアドレスを入力してください:"
input_email = gets.chomp

# 入力されたメールアドレスを検証する
validate_email(input_email)
Q
正解コードの解説

コードをブロックごとに分割して解説します。

メソッドの定義と正規表現による検証

def validate_email(email)
  regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  if email.match?(regex)
    puts "有効なメールアドレスです"
  else
    puts "無効なメールアドレスです"
  end
end
〇 メソッドの定義
  • def validate_email(email)validate_emailという名前のメソッドを定義しています。
  • このメソッドは引数としてメールアドレス(email)を受け取ります。
〇 正規表現

regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i:メールアドレスの形式を検証するための正規表現を定義しています。

〇 \A:文字列の先頭を意味します。

[\w+\-.]+:英数字、アンダースコア、プラス記号、ハイフン、ドットが1文字以上続く部分を表します。

  • @@記号を表します。
  • [a-z\d\-.]+:ドメイン部分(英小文字、数字、ハイフン、ドットが1文字以上)。
  • \.:ドットを表します。
  • [a-z]+:トップレベルドメイン(英小文字が1文字以上)。
  • \z:文字列の終端。
  • /i:大文字小文字を区別しないことを指定するフラグです。
〇 正規表現を使用した判定
  • email.match?(regex):メールアドレスが正規表現regexに一致するかどうかを判定します。
  • 一致しない場合、"無効なメールアドレスです"を出力します。
  • 一致した場合、"有効なメールアドレスです"を出力。

ユーザーからの入力

puts "メールアドレスを入力してください:"
input_email = gets.chomp
〇 出力

puts "メールアドレスを入力してください:":ユーザーにメールアドレスを入力するよう促します。

〇 入力の基本
  • input_email = gets.chomp:ユーザーが入力した内容を受け取り、改行を削除して変数input_emailに代入します。
  • chomp:末尾の改行を削除します。
  • gets:ユーザーの入力を取得します。

メソッドの呼び出し

validate_email(input_email)

validate_email(input_email):ユーザーが入力したメールアドレスを検証するため、validate_emailメソッドを呼び出しています。

まとめ

今回の例では正規表現を使ってメールアドレスの形式をチェックしました。

Rubyでは正規表現を活用することで、簡潔かつ効果的にデータ検証を行うことができます。

ぜひこのプログラムを参考にして、他のデータ形式(電話番号や郵便番号など)にも挑戦してみてください!

Rubyの柔軟性を活かして、楽しいプログラミングライフを送りましょう!

もっと分かりやすいサイトにするために

この記事を読んで「ここが分かりにくかった」「ここが難しかった」等の意見を募集しています。

世界一わかりやすいRuby学習サイトにするため、ぜひ 問い合わせフォーム からご意見下さい。

<<前のページ

Rubyの記事一覧

次のページ>>

FAQ|Rubyの正規表現の基本と使い方に関するよくある質問

Q
Q1. Rubyでメールアドレスを正しく判定する正規表現パターンとは?

一般的な形式であれば /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i が使われます。この正規表現は「英数字」「@」「ドメイン名」などを適切にチェックするもので、初心者にも扱いやすく安全です。

Q
Q2. Rubyで正規表現を使って文字列を置き換えるにはどうすればいいですか?

gsub メソッドを使うことで、特定の文字列を他の文字列に置き換えることができます。例:text.gsub(/Ruby/, "プログラミング") のように記述すれば、”Ruby” を “プログラミング” に変換できます。

Q
Q3. 正規表現で大文字・小文字を区別しない検索は可能ですか?

はい、正規表現の末尾に i フラグを付けることで大文字と小文字の違いを無視できます。例えば /ruby/i と書くと “Ruby” や “RUBY”、”ruby” すべてにマッチします。

記事URLをコピーしました