はじめに
正規表現という言葉自体はよく聞くけれど、記号だらけでよくわからない…と感じていませんか?
私自身も「文字列に対して条件にあてはまるかあてはまらないかを判定するもの」というイメージのみで、内容を理解しきれていませんでした。
そんな時にXで「正規表現パズル」というものがあるらしいという投稿を見て、、ゲーム感覚で学んでみたところ、「こう考えれば読み解きやすいんだ!」というコツがつかめてきました。
この記事では、「こういう風に考えれば、正規表現の記号たちを読み解きやすいのでは」という私なりの理解をまとめています。
学習中のため、内容に誤りや分かりにくい点が含まれている可能性があります。
お気づきの点などございましたらコメントいただけますと幸いです。
本記事では各記号の網羅的な解説(チートシート的な内容)は省いています。個々の記号の意味を詳しく知りたい方は「正規表現 チートシート」などで検索してみてください!
正規表現は何をチェックするもの?
正規表現とは文字列のパターンを表現するための記法です。
単に「条件にあてはまるかを判定する」というと「バリデーション」と近藤しやすいですが、以下のような違いがあります。
- バリデーション:必須入力、最大文字数、数値範囲、メールアドレス形式等を総合的にチェックする仕組み
- 正規表現:文字列が「どんな文字で」「どう並んでいるか」というパターンそのものを判定する仕組み
正規表現をわかりやすく理解するポイント
正規表現は基本的に先頭から順に文字が定義されたパターンに一致しているかを確認しています。
^[\w\.-]+@[\w\.-]+\.\w+$のように一見するとよくわからない記号の組み合わせでも下記の手順で考えることでどういう条件でマッチさせているのか読み解くことができます。
読むときの手順
- 記号をブロックごとに分解する
- 各ブロックを人間の言葉(文章)に置き換えてみる
作るときの流れ
- マッチさせたい文字・させたくない文字の共通点を見つける
- 条件をステップごとに分解する
- 対応する記号に置き換える
分解して考えてみる
正規表現は文字列の「健康診断」を行うようなイメージです。
健康診断では目や身長、体重等各部位の検査項目を順にチェックしていくように、
正規表現も、文字列の一文字ずつをパターンに一致しているかを確かめていきます。
簡単な例:(みかん|りんご)
これは「みかん」または「りんご」という検査項目です。
「みかん」を入力した場合
み → 「みかん」の1文字目と一致している
か → 「みかん」の2文字目と一致している
ん → 「みかん」の3文字目と一致している
判定:マッチする
「みりん」を入力した場合
み → 「みかん」の1文字目と一致している
り → 「みかん」の2文字目は「か」を期待しているため不一致
判定:マッチしない
複雑な記号のパターンを分解してみる
それでは、^[\w\.-]+@[\w\.-]+\.\w+$という正規表現をまず分解してみましょう。
大きく分けると以下のような7つの塊で考えることができます。
1 ^
2 [\w\.-]+
3 @
4 [\w\.-]+
5 \.
6 \w+
7 $
一つずつ文章に置き換えていきます。
1 ^
これは文字列のはじまりを表す記号です。先頭一致させたい場合に使います。
例えば、「みかん」から始まる文字列を検索したい時に^みかんとすることで、「みかんゼリー」や「みかんジュース」を一致させ、「夏みかん」や「甘いみかん」を除外することができます。
2 [\w\.-]+
この塊はさらに\w \. - と+に分解することができます。
-
[]は「この中のどれか1文字」 -
\wは半角英数字と_(アンダーバー) -
\.は.
※.のみがなんでも良い文字を表すメタ文字のため\をつけることで「文字通りのドット.」を表します。 -
-は ハイフン
を表します。
そのため
[\w\.-]
は
「英数字・_・.・- のどれか1文字」
という意味になります。
さらに + が付くことで
「それらの文字が1文字以上続く」
となります。
👉 意味: 「半角英数字・_・.・- のいずれかの文字が 1文字以上続く」
3 @
👉 意味: 「次に @(アットマーク)が1文字来る」
4 [\w\.-]+
👉 意味: 2と同じく「半角英数字・_・.・- のいずれかの文字が 1文字以上続く」
5 \.
👉 意味: 「次にドット . が1文字来る」
6 \w+
👉 意味: 「半角英数字・_ のいずれかの文字が 1文字以上続く」
7 $
これは文字列の終わりを表す記号です。後方一致させたい場合に使います。
例えば、「みかん」で終わる文字列を検索したい時にみかん$とすることで、「夏みかん」や「甘いみかん」を一致させ、「みかんゼリー」や「みかんジュース」を除外することができます。
このように分解してみてみることで^[\w\.-]+@[\w\.-]+\.\w+$という記号の集合が
1 「半角英数字、_(アンダーバー)、.(ドット)」のいずれかの文字1文字以上からはじまり
2 次に@があり
3 次に「半角英数字、_(アンダーバー)、.(ドット)」のいずれかの文字が1文字以上あり
4 次に. があり
5 「半角英数字、_(アンダーバー)」のいずれかの文字が1文字以上で終わる
というパターンであることが読み解けます。
今回の場合は、メールアドレスを簡易的にチェックするためのパターンだったということが読み解けます。
発展編:条件を判定する「先読み・後読み」
正規表現には「特定の文字の前後にあるかどうか」を確認しつつ、その文字自体は抽出結果に含めない**「先読み」「後読み」**という便利機能もあります。
先読み((?=...))
「後ろに特定の文字列が続いている場合のみ」** マッチさせます。
例:夏(?=みかん)
- 「夏」という文字にマッチするが、直後に「みかん」がある場合のみ採用する。
- 抽出結果は「夏」のみ(「みかん」は含まない)。
後読み((?<=...))
「前に特定の文字列がある場合のみ」 マッチさせます。
例:(?<=みかん)ゼリー
- 「ゼリー」という文字にマッチするが、直前に「みかん」がある場合のみ採用する。
- 抽出結果は「ゼリー」のみ(「みかん」は含まない)。
まとめ
一見すると呪文や記号の羅列に見える正規表現ですが、以下の考え方を持つとグッと扱いやすくなります。
- 左から右へ、1文字ずつ検査していく「健康診断」のようなもの
- 長いパターンも、意味を持つ「小さな塊」に分解して読めば怖くない
- 先頭(
^)・末尾($)・文字群([...])・繰り返しの量指定子(+)などの基本構造を押さえるのがコツ
パズル感覚で少しずつ分解しながら読む癖をつけると、徐々に自分でパターンを作成できるようになっていきます。まずは身近な文字列のチェックから試してみてください!