人間のための正規表現:実践ガイド
正規表現(regex)にはイメージの問題があります。まるで誰かがキーボードの上で寝落ちしたかのように見えます:^[\w.-]+@[\w-]+\.[\w.]+$。コードレビュー、テキストエディタ、検索ツール、フォームバリデーションで登場します。開発者は正規表現を愛するか、完全に避けるかのどちらかです。
真実はその中間にあります。正規表現は本当に強力です。また、最初は本当に混乱します。しかし、実用的な価値を得るために、すべての細かい機能をマスターする必要はありません。ほんの一握りのパターンで、実世界のユースケースの大部分をカバーできます。
正規表現が実際にすること
正規表現は、文字列の集合を記述するパターンです。検索ツールに渡すと、パターンに一致するすべての文字列を見つけます。非常に精密な検索クエリのようなものです。
通常の検索:正確に「hello」を見つける 正規表現検索:メールアドレス、電話番号、日付、URL、その他記述可能なあらゆるパターンに見えるものを見つける。
ご存知ですか? 正規表現は1956年に数学者Stephen Kleeneによって、形式言語理論における「正規言語」を記述するための表記法として発明されました。1960年代と1970年代の初期のUnixテキストエディタを通じてコンピューティングに導入されました。
構成要素
リテラル文字
最もシンプルな正規表現は単なるリテラルテキストです。パターンhelloは文字列「hello」に一致します。特別なことはありません。
ドット(.)— 任意の1文字
ドットは任意の1文字に一致します(改行を除く)。
h.tは「hat」「hit」「hot」「hut」さらに「h3t」にも一致
文字クラス([])— 特定の文字
角括弧はその位置で許可される文字のセットを定義します。
[aeiou]は任意の母音1文字に一致[0-9]は任意の数字に一致[A-Za-z]は任意の文字(大文字または小文字)に一致[^0-9]は数字ではない任意の文字に一致(角括弧内の^は「否定」を意味する)
量指定子 — いくつ
これらのシンボルは繰り返しを制御します:
| シンボル | 意味 | 例 | 一致するもの |
|---|---|---|---|
* |
0回以上 | ab*c |
「ac」「abc」「abbc」「abbbc」 |
+ |
1回以上 | ab+c |
「abc」「abbc」「abbbc」(「ac」は不可) |
? |
0回または1回 | colou?r |
「color」と「colour」 |
{3} |
正確に3回 | a{3} |
「aaa」 |
{2,4} |
2〜4回 | a{2,4} |
「aa」「aaa」「aaaa」 |
アンカー — 位置
- 先頭の
^は「文字列の先頭」を意味 - 末尾の
$は「文字列の末尾」を意味 ^hello$は正確に「hello」という文字列のみに一致。「say hello」や「hello world」には一致しない
ショートハンドクラス
よく使う文字クラスにはショートカットがあります:
| ショートハンド | 等価表現 | 意味 |
|---|---|---|
\d |
[0-9] |
任意の数字 |
\w |
[A-Za-z0-9_] |
任意の「単語」文字 |
\s |
[ \t\n\r] |
任意の空白文字 |
\D |
[^0-9] |
数字以外の任意の文字 |
\W |
[^A-Za-z0-9_] |
単語文字以外の任意の文字 |
\S |
[^ \t\n\r] |
空白以外の任意の文字 |
グループ(())— グループ化とキャプチャ
丸括弧はパターンの一部をグループ化します。グループに量指定子を適用したり、一致の特定の部分を抽出する際に便利です。
(ab)+は「ab」「abab」「ababab」に一致(\d{3})-(\d{4})は「555-1234」に一致し、「555」と「1234」を別々にキャプチャ
パイプ(|)— または
パイプは「または」を意味します。
cat|dogは「cat」または「dog」に一致(jpg|png|gif)はこの3つの画像拡張子のいずれかに一致
今日から使える実践パターン
メールアドレスの一致(シンプル版)
[\w.-]+@[\w-]+\.[\w.]+
分解すると:
[\w.-]+— 1つ以上の単語文字、ドット、またはハイフン(ローカル部分)@— リテラルの@記号[\w-]+— 1つ以上の単語文字またはハイフン(ドメイン)\.— リテラルのドット(.は特殊文字なのでエスケープ)[\w.]+— 1つ以上の単語文字またはドット(TLD)
注意 正規表現によるメールバリデーションは完璧に行うのが非常に難しいことで知られています。上記のシンプルなパターンは実世界のメールアドレスの99%をカバーしますが、RFC仕様で定義されているすべてのエッジケースには対応していません。本番のバリデーションには、プログラミング言語のメールバリデーションライブラリを使用してください。
電話番号の一致(米国形式)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
以下に一致:
- (555) 123-4567
- 555-123-4567
- 555.123.4567
- 555 123 4567
URLの一致
https?://[\w.-]+(/[\w./-]*)?
以下に一致:
日付の一致(YYYY-MM-DD)
\d{4}-\d{2}-\d{2}
以下に一致:2026-03-23、1999-12-31など。
重複する単語の検出
\b(\w+)\s+\1\b
「the the」や「is is」のような繰り返し単語に一致します。\1は最初のグループでキャプチャされたものへの後方参照です。
IPv4アドレスの一致
\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}
192.168.1.1や10.0.0.255のようなパターンに一致します。
正規表現を書くためのヒント
1. シンプルに始めて、改善する
最初の試みで完璧な正規表現を書こうとしないでください。広いパターンから始め、データに対してテストし、絞り込んでいきましょう。
2. 必ずテストする
正規表現は間違えやすいものです。量指定子の欠落やエスケープされていないドットで、一致する内容がまったく変わることがあります。本番で使用する前に、必ず実データに対してパターンをテストしてください。
3. 特殊文字をエスケープする
リテラルのドット、丸括弧、角括弧、その他の特殊文字に一致させる必要がある場合は、バックスラッシュでエスケープします:\.、\(、\[。
4. コメントと名前付きグループを使う
複雑なパターンでは、名前付きグループとコメント(サポートされている場合)を使用して、正規表現を読みやすくしましょう。将来の自分が感謝するでしょう。
5. 正規表現を使うべきでない場合を知る
正規表現はHTML、XML、JSON、その他のネスト構造のパースには不適切なツールです。それらには適切なパーサーを使用してください。
ヒント 正規表現パターンをリアルタイムでテスト・デバッグ:正規表現パターンのテスト方法。パターンとテストデータを貼り付けて、一致箇所が即座にハイライトされるのを確認できます。
今すぐ正規表現のテストを始めましょう:
無料、即座にフィードバック、登録不要です。