業務で正規表現に触れる機会があったのですがあまり理解していなかったため、備忘も兼ねて改めて整理してみました。
本記事では正規表現の記法を詳述するものではなく、実際に使用される機会の多いパターンを紐解いていくことで、概要を把握することを目的とします。
より詳しい内容は各種リファレンス等を参照ください。また今回はPHPでの記法になります。
そもそも正規表現って何?
ネット上のいくつかの記事を参考にしたところ、共通して抽出できる言葉は以下のようなものでした。
『正規表現とは、いくつかの文字列を一つの形式で表現するための表現方法』
文面上では分かりづらいので具体例で考えてみようと思います。
例えば、果物を表すこれらの文字列を一つの形式で表現してみるとどのようなものになるでしょうか?
apple
pineapple
melon
strawberry
orange
上記5つの文字列を正規表現で表記すると以下になります。
//果物を示す文字列を正規表現で表記
[a-z]+
以下で説明していきます。
まず[a-z]は文字クラスと呼ばれるもので、角括弧 [ と ] 内に囲まれたいずれかの一文字にマッチします。その次に”+”は量子定止と呼ばれるもので、ある文字が1回以上の繰り返していることを示します。
したがってまとめると
[a-z] → “a” ~ “z”の文字が
- → 1回以上繰り返すものにマッチする
文字列という形になります。
結果的に上記5つの果物の文字列を単一で表現できるという形になります。
実際によく使用される正規表現を紐解いてみる
それでは実際に正規表現の具体例を見ていきます。
今回は正規表現の使い方の例を確認することが目的であるため、当該正規表現自体の脆弱性(Regular expression Denial of Service)等はスコープ外としております。
実際に使用される場合は、機能要件やセキュリティ等を鑑みる必要がありますのでご注意ください。
## 郵便番号
//郵便番号の正規表現
/^[0-9]{3}-[0-9]{4}$/
正規表現 | 名称 | 役割 |
---|---|---|
/../ | デリミタ | この中に正規表現のパターンを記述 |
^ | キャレット | 文頭を示す |
$ | ドルマーク | 文末を示す |
[0-9] | 大括弧内に数字 | 0-9までのいずれかの数値にマッチすることを示す |
{n} | 中括弧内に任意の数値 | 直前の文字の桁数を示す |
まとめると以下になります。
//正規表現の開始
/
// 文頭から0~9までの数字が3文字続く
^[0-9]{3}
//郵便番号を区切るハイフン
-
// 0~9までの数字が3文字続く
[0-9]{3}
//正規表現の終了と文末を示す
$/
##メールアドレス
/^[a-zA-Z0-9]+[a-zA-Z0-9\._-]*@[a-zA-Z0-9_-]+[a-zA-Z0-9\._-]+$/
上記と重複する内容は割愛致します。
今回新しく出てきた内容のみをピックアップしてみます。
正規表現 | 名称 | 役割 |
---|---|---|
+ | プラス | 1回以上の繰り返し |
* | アスタリスク | 0回以上の繰り返し |
|バックスラッシュ | 直後のメタ文字をエスケープする。ここでは直後の’.’ピリオドをエスケープしています |
まとめると以下になります。
//正規表現の開始
/
//文頭から小文字・大文字の英数字のみが1回以上繰り返される
^[a-zA-Z0-9]+
//@マークの直前では大文字・小文字の英数字と文字列”., _, -”が0回以上繰り返される
[a-zA-Z0-9\._-]*@
//上記の続きで@マーク直後から小文字・大文字の英数字のみが1回以上繰り返される
[a-zA-Z0-9]+
//大文字・小文字の英数字と文字列”., _, -”が0回以上繰り返される
[a-zA-Z0-9\._-]+
//正規表現の終了と文末を示す
$/
まとめ
今回はPHPでの正規表現についてざっくりまとめてみました。
上記は正規表現の記法のほんの一部でしかないので詳細は各種リファレンスを参照ください。
また各言語によって記法も異なるのでご注意ください。
参照サイト