>_devtools-hub
正規表現プログラミング開発tips

正規表現パターン実践集 — 現場でよく使う30パターンと落とし穴

メールアドレス・URL・電話番号・日付・IPアドレスなど、実際の開発現場でよく使う正規表現パターンとその注意点を解説します。

正規表現は習得コストが高い一方、マスターすると文字列処理の幅が劇的に広がります。この記事では、バリデーション・抽出・置換という3つの用途別に、実際の開発現場で頻繁に使うパターンとその落とし穴を整理しました。正規表現を書くたびにGoogle検索する手間をなくし、自信を持って使えるようになることを目指します。

バリデーション:入力値の形式チェック

メールアドレスの検証はシンプルな `/^[^s@]+@[^s@]+.[^s@]+$/` で大半のケースをカバーできます。RFC 5321の完全準拠パターンは複雑すぎて実用的でないため、基本構造(ローカル部・@・ドメイン・TLD)を確認する程度で十分です。日本の電話番号は `/^0d{9,10}$/` で固定電話・携帯を一律カバーできます。ハイフン区切りを許容する場合は `/^0d{1,4}-d{1,4}-d{4}$/` を使います。郵便番号は `/^d{3}-?d{4}$/`(ハイフン任意)が定番です。URLの検証は正規表現よりも `new URL()` を使ってキャッチする方が確実で、プロトコル・ホスト・ポートを個別に取り出す場合にも `URL` オブジェクトの方が扱いやすいです。

抽出:文字列からデータを取り出す

ログファイルのパースやHTMLからの情報抽出では、キャプチャグループ(括弧で囲んだ部分)を活用します。`/(d{4})-(d{2})-(d{2})/` で日付をパースすると、マッチ結果の [1]・[2]・[3] にそれぞれ年・月・日が格納されます。名前付きキャプチャグループ `/(?<year>d{4})-(?<month>d{2})-(?<day>d{2})/` を使うと `match.groups.year` のように名前でアクセスでき、コードの可読性が向上します。複数箇所に出現するパターンをすべて抽出する場合は `String.matchAll()` が便利で、グローバルフラグ(g)と組み合わせることで全マッチをイテレータとして取得できます。

置換:変換・サニタイゼーション

`String.replace()` の第二引数に関数を使うと、マッチした文字列を動的に変換できます。例えばキャメルケースをスネークケースに変換する `str.replace(/[A-Z]/g, c => '_' + c.toLowerCase())` は、フロントエンドとバックエンドでの命名規則変換に活用できます。HTMLのエスケープは `/[&<>"']/g` で特殊文字をキャプチャし、対応するHTMLエンティティに置換します。ただしHTMLの解析や生成には正規表現よりもDOMパーサを使う方が安全です。テンプレート文字列の変数展開も `/{{(w+)}}/g` のようなパターンで実現できますが、XSSリスクを伴うためサニタイゼーションとセットで実装することが必須です。

よくある落とし穴と対処法

正規表現で陥りやすいミスのトップは「貪欲マッチ(greedy)と非貪欲マッチ(lazy)の混同」です。`<.+>` はHTMLタグを取り出そうとすると行全体にマッチしてしまいます。`<.+?>` と `?` を付けることで最短マッチになり意図通りに動きます。次に多いのが「ドット(.)が改行にマッチしない」問題です。複数行にわたるパターンを書く場合は `s`(dotAll)フラグを追加します。また、`^` と `$` は通常「文字列全体の先頭・末尾」を指しますが、`m`(multiline)フラグを付けると「各行の先頭・末尾」になるため、意図によって使い分けが必要です。パフォーマンス面では「カタストロフィックバックトラッキング」という問題があり、ネストした繰り返し(`(a+)+` など)が特定の入力で指数関数的に遅くなることがあります。

まとめ

正規表現はすべてを覚えようとするのではなく、「パターンの構造を理解して必要なときに素早く書ける」状態を目指すことが重要です。Regex Studioのようなビジュアルテスターを手元に置き、パターンを書きながらリアルタイムでマッチ結果を確認する習慣をつけると、試行錯誤のコストが大幅に下がります。

このツールで試す

Regex Studio

正規表現リアルタイムテスター

開発者向けテキスト正規表現

使ってみる →

BOOTH

Text Case Converter

テキストを8形式のケースに一括変換・コピー

開発者向けテキストユーティリティ

使ってみる →

BOOTH

String Inspector

文字列を1文字ずつ分解 — Unicodeコードポイント・UTF-8バイト数・文字種を可視化

文字列Unicodeエンコーディング開発者向け

使ってみる →

BOOTH