はじめに
本記事はRailsにおける正規表現の簡単な表現方法や、実際に使うシーンに合わせて具体例を紹介するものです。正規表現についてほとんど理解のない方に向けて書いておりますので本記事を読むことで正規表現の知識がグッと深まる。ということはありません。一方で、正規表現を使いたいけど、全然わからない。という段階の方にとっては少しは役に立つかと思いますので、その点を理解いただいた上で、お読みください。
なお、筆者も学び始めにつき、間違った表現などございましたら、ご指摘をいただけると幸いでございます。よろしくお願いいたします。
正規表現とは
「多数の文字列の集合を一つの文字列として表現すること(Wiki)」ですが、主な用途としては入力フォーム等で特定のパターン(英数字・大文字小文字など)を指定したい時などに用います。Railsで使用する際は、モデルでバリデーションに正規表現を適用し用いることが一般的です。
##実際のモデルへの書き方
class Test < ApplicationRecord
validates :name format: { with: /\A[ぁ-んァ-ヶ一-龥々]+\z/ }
end
上記の例の場合、正規表現を適用させたいのはnameカラムです。format:
に続けて{}を記述します。
{}内のwith:
に続けて記載されている/\A[ぁ-んァ-ヶ一-龥々]+\z/
が正規表現の一例です。
※これは「全ての日本語」を指定しています。
この場合、nameカラムは「全ての日本語の入力を許可する」といういう意味合いになります。
この/\A[ぁ-んァ-ヶ一-龥々]+\z/
にあたる箇所を書き換えることにより、入力フォーム等に様々な制約をかけることができます。
基本的な表現方法のご紹介
正規表現に用いる表現は多岐にわたり、全てを理解することは極めて困難です。
以下に、難解な正規表現のなかで私が特に理解しやすいと感じたものをピックアップしてみました。
細かな表現は、本記事の末、引用に公式リファレンスのリンクを設置してありますので、さらに細かな表現方法を学びたい方はそちらもチェックしてみてください!
● 文頭と文末の/
「/から/までの範囲が正規表現ですよ」という、始まりと終わりを表します。
● .
どの1文字にもマッチということを表します。(改行は除きます)
● [a-c]
a,b,cまでの半角英小文字のうち、いずれかの文字が出現すればマッチということを表します。(-は範囲を示します)
● \d
半角数字であればマッチということを表します。
● \w
半角の文字・数字・アンダースコアにマッチということを表します。
● c{3}
cが3回連続して出現すればマッチということを表します。
● c{3,5}
cが3回以上5回以下、連続して出現すればマッチということを表します。
● (d|e|f)
dまたはeまたはfが出現すればマッチということを表します。
パターンのご紹介
開発しているアプリやサイトで入力フォームを作ることを想定し、「パスワード」「電話番号」「郵便番号」の3つの使われそうなパターンを以下でご紹介します。
◉パスワード
#半角英数字いずれかが6文字以上 ※大文字小文字の区別なし
/[a-z\d]{6,}/i
#半角英数字混合で6文字以上 ※大文字小文字の区別なし
/\A(?=.*?[a-z])(?=.*?\d)[a-z\d]{6,}+\z/i
#半角英数字大文字小文字混合で6文字以上
/\A(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\d)[a-zA-Z\d]{6,}+\z/
※{6,}の部分を{6,10}にすると、「6文字以上10文字以下」と表現することもできます
◉電話番号
#半角数字ハイフンなしで10桁or11桁
/\A\d{10,11}\z/
#(3桁ハイフン4桁ハイフン4桁)の半角数字 ※携帯電話を想定
/\d{3}-\d{4}-\d{4}/
#「市外局番2から4桁、ハイフンもしくは丸カッコ、市内局番1から4桁、ハイフンもしくは丸カッコ閉じ、加入者番号4桁」の並びの半角数字
/\d{2,4}[-(]\d{1,4}[-)]\d{4}/
※これは完全な形ではなく、03-3333)1111などいびつな形でも通ってしまいます
作りたい入力フォームにどの程度の制限をかけたいかによって、より精密、もしくは簡素な記述が必要になります
◉郵便番号
#7桁の半角数字
/\A\d{7}\z/
#3桁ハイフン4桁の半角数字
/\A\d{3}[-]\d{4}\z/
#3桁ハイフン4桁の半角数字、もしくはハイフンなしでの7桁の半角数字
/\A\d{3}[-]\d{4}$|^\d{3}[-]\d{2}$|^\d{3}$|^\d{5}$|^\d{7}\z/
さいごに
正規表現をマスターするのはとても難しいと思います。私のお勧めとしては、Rubularのようなサイトで実際に手を動かしながら学ぶことで、これだと「あ、この表現だとこれはOKでこれはダメなんだな...」と頭で考えるだけよりも早く理解することができます。開発しているアプリやサイトで正規表現を用いるシーンがある際は、本記事が少しのご参考になればよいなと思っております。
引用
記事を書くにあたり、参考にさせていただいたものです。
- Rubyリファレンスマニュアル
- [Rubular(Rubyの正規表現を簡単にテストできるサイト)]
(https://rubular.com/)- nashirox様 githubリポジトリ
- @jnchito様 初心者歓迎!手と目で覚える正規表現入門・その1「さまざまな形式の電話番号を検索しよう」