はじめに
こんにちは!アメリカの大学で語学を学びながら、独学でソフトウェアエンジニアを目指している者です。
正規表現について勉強していますが、覚えることが多く、自分の中でも整理しようとこの記事を作成しました。
この記事では、正規表現の基本構文から実際の利用例までを分かりやすく解説します。正規表現初心者の方に役立つ内容を目指しました!
正規表現とは?
正規表現(Regular Expression)は、文字列のパターンを指定して検索や置換を行うための便利な記法です。
例えば以下のような用途に利用できます
- 特定形式のデータ検出(メールアドレス、電話番号など)
- パターンマッチングによるデータフィルタリング
- 文字列の置換
Rubyでは、正規表現リテラルはスラッシュ / で囲んで表現します。例えば
puts "hello" =~ /hello/ # => 0(文字列"hello"に一致)
正規表現の基本記号
.(任意の1文字)
.
は改行以外の任意の1文字に一致します。
puts "cat" =~ /c.t/ # => 0(c と t の間に任意の文字がある)
puts "ct" =~ /c.t/ # => nil(cとtの間に改行以外の任意の文字がない)
*(直前の文字が0回以上繰り返し)
*
は直前の部分式が0回以上繰り返される部分に一致します。
なお、
puts "aaa" =~ /a*/ # => 0(a が0回以上繰り返される)
puts "bbb" =~ /a*/ # => 0(a が0回でも良いのでマッチ)
+(直前の文字が1回以上繰り返し)
+
は直前の部分式が1回以上繰り返される部分に一致します。
puts "aaa" =~ /a+/ # => 0(a が1回以上繰り返される)
puts "bbb" =~ /a+/ # => nil(a が1回以上ないのでマッチしない)
?(直前の文字が0回または1回)
?
は直前の部分式が0回または1回に一致します。
puts "ab" =~ /ac?/ # => 0
puts "abc" =~ /ac?/ # => 0
puts "abcc" =~ /ac?/ # => 0
[](文字クラス)
[]
を使うと、指定した文字のいずれか1つに一致します。
puts "apple" =~ /[aeiou]/ # => 0(母音にマッチ)
puts "sky" =~ /[aeiou]/ # => nil(母音がない)
範囲指定も可能です。
puts "5" =~ /[0-9]/ # => 0(数字にマッチ)
puts "A" =~ /[A-Z]/ # => 0(大文字にマッチ)
()(グループ化)
()
を使うと、部分パターンをグループ化して扱えます。
また、キャプチャ(抽出)として利用できます。
/(a+b)/ =~ "aaab"
puts $1 # => "aaab"(キャプチャされた部分)
ここで、(a+b)
は足し算ではなくa
を1回以上繰り返すという意味なので注意しましょう。
アンカー(^ と $)
^
は行頭を示し、$
は行末および文末を示します。
$
の挙動については、以下の記事で書いてあるのでそちらも併せてみていただくと理解度が深まると思います
エスケープ文字
特別な意味を持つ記号(例:+, ., *
)を通常の文字として扱う場合、\ を使ってエスケープします。
puts "1+1=2" =~ /\+/ # => 1(+ にマッチ)
puts "a.b" =~ /\./ # => 1(. にマッチ)
実際の利用例
いくつか正規表現を見てきましたが、具体例を挙げてみようと思います。
日本の電話番号に一致する例です。
以下のコードは3-4-4の電話番号のみに対応したコードになりますので実装する際は注意ください。
phone = "090-1234-5678"
puts phone =~ /\A\d{3}-\d{4}-\d{4}\z/ # => 0(マッチ)
-
\A
文字列の先頭を示します。この場合のちに数字を表す\d
が来るので、先頭は数字である必要があります。 -
\d{3}
数字(\d)が3文字続く部分に一致します。これは電話番号の市外局番(例: 090)に対応します。 -
-
ハイフンそのものに一致します。
\d{4}
数字が4文字続く部分に一致します。これは電話番号の中央部分(例: 1234)に対応します。 -
\d{4}
(最後の部分)
数字が4文字続く部分に一致します。これは電話番号の末尾部分(例: 5678)に対応します。 -
\z
文字列の末尾を示します。
つまり文字列の最後が数字が4文字になるという意味になります。
まとめ
いくつか上記で正規表現を紹介しました。
正規表現は最初は慣れない(わたしも現在進行形で勉強中)ので覚えるというよりパターンに慣れたほうが早く使いこなせそうです。
ruby以外でも正規表現は使うようなので、しっかりマスターしていきたいと思います。
今回のまとめの記事が正規表現初心者の方の参考になっていただければ幸いです。