正規表現は「読めるけど書けない」「動くけど合っているか不安」が二大悩み。本記事では、実務でそのまま使える23パターンを 用途別×言語別の落とし穴つき で整理します。コピペして使う前に、必ず正規表現テスターで実データを通して確認することをおすすめします。
基本構造をまずおさらい
| 記号 | 意味 |
|---|---|
^ $ |
行頭・行末 |
. |
任意の1文字(改行除く) |
* + ? |
0回以上・1回以上・0または1回 |
{n,m} |
n〜m回繰り返し |
\d \w \s |
数字・単語文字・空白 |
[abc] [^abc] |
文字クラス・否定 |
(...) (?:...) |
キャプチャ・非キャプチャ |
| |
OR |
入力バリデーション系
1. メールアドレス(実用版)
^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
罠:RFC完全準拠の正規表現は数千文字になります。実務では「@とドットを含む形式」程度のチェックで十分。最終的なメール到達確認はバリデーションメール送信 で行います。
2. 日本の電話番号
^0\d{1,4}-\d{1,4}-\d{4}$
国際形式を含めるなら ^(\+81|0)\d{1,4}-?\d{1,4}-?\d{4}$。
3. 郵便番号(日本)
^\d{3}-?\d{4}$
4. URL(http/httpsのみ)
^https?:\/\/[^\s/$.?#].[^\s]*$
5. パスワード(英大小・数字・記号 8文字以上)
^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[!@#$%^&*]).{8,}$
否定先読み(?=...)で4条件を同時に満たす形。詳しくはパスワード生成ツールで生成しつつ確認できます。
日付・時刻系
6. YYYY-MM-DD 形式の日付
^\d{4}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01])$
罠:これは「31/2」のような存在しない日付も通る形式チェックです。実在性チェックは
Dateオブジェクトで やるのが正解。
7. HH:MM:SS 形式の時刻
^(?:[01]\d|2[0-3]):[0-5]\d:[0-5]\d$
8. ISO 8601 日時
^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$
数値系
9. 整数(負の値含む)
^-?\d+$
10. 小数(カンマ区切り対応)
^-?\d{1,3}(?:,\d{3})*(?:\.\d+)?$
11. 百分率(%付き)
^\d{1,3}(?:\.\d+)?%$
テキスト処理系
12. 前後の空白を削除(trim相当)
str.replace(/^\s+|\s+$/g, '')
13. 連続する空白を1つに
str.replace(/\s+/g, ' ')
14. 改行で分割
str.split(/\r?\n/)
罠:
\nだけだとWindows形式\r\nの行末で\rが残ります。
15. HTMLタグの除去(簡易版)
str.replace(/<[^>]+>/g, '')
重要:本格的なHTMLサニタイズには
DOMPurify等の専用ライブラリを使うこと。正規表現はXSS対策には不十分です。
抽出・パース系
16. URL中のクエリパラメータ抽出
[?&]([^=&]+)=([^&]*)
17. メールのドメイン部分
@([a-zA-Z0-9.-]+\.[a-zA-Z]{2,})$
18. ファイル名と拡張子の分離
^(.+?)\.([^.]+)$
19. 日本のクレジットカード番号(Visa/Master/JCB/AMEX)
^(?:4\d{12}(?:\d{3})?|5[1-5]\d{14}|35\d{14}|3[47]\d{13})$
言語ごとの注意点
| 言語 | エスケープ | 補足 |
|---|---|---|
| JavaScript | /regex/ または new RegExp(...) |
\ は文字列内では \\ |
| Python | r"regex"(raw string) |
re.compileが高速 |
| Java | "regex" (\\d のように二重エスケープ) |
Pattern.compile使用 |
| PHP | '/regex/' |
デリミタが必要 |
| Go | バッククォート文字列推奨 | regexpパッケージ |
| MySQL | REGEXP 演算子 |
バックスラッシュは \\ |
デバッグ・検証のコツ
コツ1:境界条件を必ず試す
- 空文字
"" - 1文字だけ
- 想定の最大長
- 全角/半角の混在
- 改行・タブを含む文字列
コツ2:欲張らない
「動作する最小の表現」が正解です。.* を多用すると、思わぬ範囲までマッチしたり、パフォーマンス問題(バックトラック爆発)が起きます。
# ✗ 悪い例(バックトラック爆発の可能性)
^(a+)+$
# ○ 良い例
^a+$
コツ3:可読性を捨てない
正規表現は「動けば良い」という気持ちで書くと、3ヶ月後の自分が読めません。
- 長くなるならコメント付きモード(
xフラグ)を使う - 複雑なロジックは正規表現1本にせず、複数ステップに分ける
- 名前付きキャプチャ
(?<year>\d{4})で意図を明示
