正規表現入門:理解しやすいパターンの書き方
正規表現の構文をわかりやすく解説。バリデーションや検索に役立つよく使うパターンと、ストレスなく式をテストする方法を紹介します。
正規表現(regex)は読みにくいという印象を持たれがちです。しかし基本的な構成要素さえ覚えてしまえば、ユーザー入力のバリデーションからログファイルの検索まで、開発者の武器として非常に強力なツールになります。
正規表現とは?
正規表現とは、文字列の集合を表すパターンです。正規表現エンジンにパターンと対象文字列を渡すと、パターンが一致するかどうか(そしてどの位置で一致するか)を返してくれます。
const pattern = /hello/i;
pattern.test("Hello World"); // true
/i フラグを使うと、大文字・小文字を区別せずにマッチします。JavaScriptでは、フラグは末尾の / の後に記述します。
基本的な構成要素
| 記号 | 意味 | 例 | マッチする文字列 |
|---|---|---|---|
. |
任意の1文字(改行を除く) | h.t |
hat, hit, hot |
* |
直前の要素の0回以上の繰り返し | ab*c |
ac, abc, abbc |
+ |
直前の要素の1回以上の繰り返し | ab+c |
abc, abbc(acは不可) |
? |
直前の要素の0回または1回 | colou?r |
color, colour |
\d |
任意の数字(0〜9) | \d{3} |
123, 007 |
\w |
単語構成文字(英字、数字、_) | \w+ |
hello, user_1 |
\s |
空白文字(スペース、タブ、改行) | \s+ |
スペースにマッチ |
^ |
文字列の先頭 | ^Hello |
Hello… |
$ |
文字列の末尾 | world$ |
…world |
文字クラス
角括弧を使うと、マッチさせたい文字のセットを定義できます。
[aeiou] — 任意の母音
[A-Z] — 任意の大文字
[0-9a-f] — 任意の16進数字
[^0-9] — 数字以外の任意の文字
グループと選択
括弧でパターンの一部をグループ化し、| で「または」を表現できます。
(cat|dog)s? — cat, cats, dog, dogs にマッチ
(\d{3})-(\d{4}) — 555-1234 にマッチし、各部分をキャプチャ
キャプチャグループは抽出に便利です。乱雑なテキストから電話番号、日付、IDなどを取り出せます。
よく使う実用パターン
メールアドレス(簡易版)
^[^\s@]+@[^\s@]+\.[^\s@]+$
「何か @ 何か . 何か」という形式をチェックします。クライアントサイドのバリデーションには十分です。本番環境では、Email Validator を使った実際の配信確認で検証することをお勧めします。
URL
https?:\/\/[^\s/$.?#].[^\s]*
http と https の両方のURLにマッチします。有効なURLの構築については、URL & Query String Builder をご覧ください。
電話番号(米国形式)
\(?\d{3}\)?[-.\s]?\d{3}[-.\s]?\d{4}
(555) 123-4567、555.123.4567、555-123-4567 などの形式にマッチします。
日付(YYYY-MM-DD形式)
\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])
正規表現のデバッグ
学習の近道はインタラクティブにテストすることです。Regex Tester にパターンとサンプル文字列を貼り付けると、マッチ箇所をリアルタイムでハイライト表示し、キャプチャグループの内容を確認でき、パターンの各部分の意味も解説してくれます。
問題を解決できる最もシンプルなパターンを書きましょう。「巧すぎる」正規表現はメンテナンスが困難です。
パフォーマンスの落とし穴
壊滅的なバックトラッキング
(a+)+b のようなネストされた量指定子は、マッチしない入力に対して指数関数的な数のパスを試みる原因になります。同じ文字が式の複数の部分でマッチできるようなパターンは避けましょう。
アンカーで処理を効率化
パターンが文字列全体にマッチすべきであれば、^ と $ を使いましょう。アンカーがないと、エンジンは部分一致を探すために文字列のすべての位置をスキャンします。
クイックリファレンスチートシート
. 任意の1文字
\d \D 数字 / 非数字
\w \W 単語構成文字 / 非単語構成文字
\s \S 空白文字 / 非空白文字
[abc] 文字セット
[^abc] 否定文字セット
(group) キャプチャグループ
(?:group) 非キャプチャグループ
a{3} ちょうど3回
a{2,5} 2回以上5回以下
a*? a+? 最短マッチ(非貪欲)版
(?=ahead) 肯定先読み
(?!ahead) 否定先読み
正規表現は積み重ねで身につくスキルです。シンプルなパターンから始め、視覚的にテストしながら、必要なときだけ複雑さを加えていきましょう。あらゆる言語が正規表現をサポートしているため、一度構文を覚えればどこでも活用できます。