正規表現(Regular Expression、略してRegex)は、文字列のパターンを表現するための特殊な記法です。テキストの検索、置換、バリデーションなど、プログラミングのあらゆる場面で活躍します。最初は記号の羅列に見えて難しく感じますが、基本を押さえれば強力な武器になります。
正規表現とは
正規表現は「文字列のパターンマッチング」を行うための記法です。例えば「3桁の数字の後にハイフンがあり、その後に4桁の数字が続く」というパターンを\d{3}-\d{4}と表現できます。
正規表現が使える場面は非常に多岐にわたります。
- 入力チェック - メールアドレスや電話番号の形式を検証
- テキスト検索 - 特定のパターンに一致する文字列を検索
- テキスト置換 - パターンに一致する部分をまとめて置換
- データ抽出 - ログファイルから特定の情報を抽出
基本メタ文字一覧
正規表現で特別な意味を持つ文字(メタ文字)を覚えましょう。
| メタ文字 | 意味 | 例 | マッチする文字列 |
|---|---|---|---|
. | 任意の1文字 | a.c | abc, aXc, a1c |
* | 直前の文字が0回以上 | ab*c | ac, abc, abbc |
+ | 直前の文字が1回以上 | ab+c | abc, abbc(acは不可) |
? | 直前の文字が0回または1回 | colou?r | color, colour |
[] | 文字クラス(いずれか1文字) | [abc] | a, b, c |
() | グループ化 | (ab)+ | ab, abab |
{n} | 直前の文字がちょうどn回 | a{3} | aaa |
{n,m} | 直前の文字がn回以上m回以下 | a{2,4} | aa, aaa, aaaa |
^ | 行の先頭 | ^Hello | 行頭のHello |
$ | 行の末尾 | world$ | 行末のworld |
\d | 数字([0-9]と同じ) | \d+ | 123, 45 |
\w | 英数字とアンダースコア | \w+ | hello, user_1 |
\s | 空白文字 | \s+ | スペース、タブ |
よく使うパターン10選
実務でよく使われる正規表現パターンを厳選して紹介します。コピペしてそのまま使えます。
1. メールアドレス
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}
一般的なメールアドレスの形式にマッチします。user@example.comのようなパターンを検証できます。
2. 電話番号(日本の形式)
0\d{1,4}-\d{1,4}-\d{3,4}
03-1234-5678や090-1234-5678などの日本の電話番号形式にマッチします。
3. 郵便番号
\d{3}-\d{4}
100-0001のような日本の郵便番号形式にマッチします。シンプルですが実用的です。
4. URL
https?://[\w!?/+\-_~;.,*&@#$%()='[\]]+
http://またはhttps://で始まるURLにマッチします。
5. IPアドレス(IPv4)
\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
192.168.1.1のようなIPv4アドレスの形式にマッチします。
6. 日付(YYYY-MM-DD)
\d{4}-(?:0[1-9]|1[0-2])-(?:0[1-9]|[12]\d|3[01])
2024-01-15のようなISO 8601形式の日付にマッチします。
7. 全角カタカナのみ
^[\u30A0-\u30FF]+$
フォームのフリガナ入力チェックなどに使えます。
8. 全角ひらがなのみ
^[\u3040-\u309F]+$
ひらがなのみの入力を検証したい場合に使います。
9. HTMLタグ
<("[^"]*"|'[^']*'|[^'">])*>
HTMLタグにマッチします。タグの除去などに使えますが、複雑なHTMLの解析にはパーサーを使うことを推奨します。
10. 半角英数字のみ
^[a-zA-Z0-9]+$
ユーザーIDやパスワードの形式チェックに使えるシンプルなパターンです。
フラグの意味と使い方
正規表現にはフラグ(修飾子)を付けることで、マッチの挙動を変更できます。
| フラグ | 名前 | 効果 |
|---|---|---|
g | global | 最初のマッチだけでなく、すべてのマッチを検索 |
i | case-insensitive | 大文字・小文字を区別しない |
m | multiline | ^と$が各行の先頭・末尾にマッチ |
JavaScriptでの使用例を見てみましょう。
// gフラグ: すべてのマッチを取得
const text = "apple banana apple cherry";
const matches = text.match(/apple/g);
// → ["apple", "apple"]
// iフラグ: 大文字小文字を無視
"Hello".match(/hello/i);
// → ["Hello"]
// mフラグ: 複数行モード
const multiline = "line1\nline2\nline3";
multiline.match(/^line/gm);
// → ["line", "line", "line"]
正規表現を書くコツ
- シンプルに始める - まずは大まかなパターンを書き、徐々に厳密にしていく
- テスターを活用する - いきなりコードに書くのではなく、テスターで動作確認する
- コメントを残す - 複雑な正規表現にはコメントで意図を説明する
- 完璧を求めすぎない - 100%のバリデーションは正規表現だけでは難しい。ある程度の精度で十分な場合も多い
正規表現テスターで試してみましょう
正規表現テスターを使ってみるまとめ
正規表現は最初こそ取っつきにくいですが、基本メタ文字とよく使うパターンを覚えるだけで実務で大いに役立ちます。この記事で紹介したパターン10選をベースに、実際にテスターで動作を確認しながら理解を深めてみてください。
特にメールアドレスや電話番号のバリデーションは、Webフォームの開発で頻繁に使うパターンです。まずはこれらをマスターして、正規表現に慣れていきましょう。