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

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

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

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

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

メールアドレスの検証はシンプルな `/^[^\s@]+@[^\s@]+\.[^\s@]+$/` で大半のケースをカバーできます。メールアドレスの書式を定める RFC 5322 に完全に従うパターンは複雑すぎて実用的でないため、基本構造(ローカル部・@・ドメイン・TLD)を確認する程度で十分です。本当に届くかは確認メールを送るまで分かりません。日本の電話番号は `/^0\d{9,10}$/` で固定電話(10桁)と携帯(11桁)をまとめて確認できます。ハイフン区切りを許容する場合の `/^0\d{1,4}-\d{1,4}-\d{4}$/` は区切りの位置だけを見ていて全体の桁数は確かめないので、ハイフンを除いてから10〜11桁のパターンにも通すと確実です。郵便番号は `/^\d{3}-?\d{4}$/`(ハイフン任意)が定番です。日本語の入力欄で必ず起きるのが全角数字で、JavaScript の `\d` は `u` フラグを付けても半角の0〜9にしか当たりません。「123-4567」はこのパターンを通らないので、先に `str.normalize('NFKC')` で半角にそろえてから確かめます。NFKC は全角のハイフン(-)も半角にしますが、長音記号(ー)は変えないので、ハイフンの代わりに打たれやすい記号は別に置き換えます。URLの検証は正規表現よりも `new URL()` を使ってキャッチする方が確実で、プロトコル・ホスト・ポートを個別に取り出す場合にも `URL` オブジェクトの方が扱いやすいです。

この手順で使うツール

Regex Studio

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

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

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

この手順で使うツール

Regex Studio

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

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

`String.replace()` の第二引数に関数を使うと、マッチした文字列を動的に変換できます。例えばキャメルケースをスネークケースに変換するのによく紹介される `str.replace(/[A-Z]/g, c => '_' + c.toLowerCase())` は、userName なら user_name になりますが、実際に通すと UserName は先頭に _ が付いて _user_name、HTMLParser は _h_t_m_l_parser、getHTTPResponse は get_h_t_t_p_response になりました。略語や先頭の大文字があると崩れます。単語の境目を「小文字か数字の後の大文字」と「大文字の連続の最後の1文字の前」の2つで探し、`str.replace(/([a-z0-9])([A-Z])/g, '$1_$2').replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2').toLowerCase()` とすると、html_parser・get_http_response のように意図どおりになります。大量の名前をまとめて変換したいときや、変換結果を目で確かめたいときは Text Case Converter に貼り付けると、同じ考え方で単語を区切って snake_case・camelCase・kebab-case などを一度に出します。HTMLのエスケープは `/[&<>"']/g` で特殊文字をキャプチャし、対応するHTMLエンティティに置換します。ただしHTMLの解析や生成には正規表現よりもDOMパーサを使う方が安全です。テンプレート文字列の変数展開も `/\{\{(\w+)\}\}/g` のようなパターンで実現できますが、XSSリスクを伴うためサニタイゼーションとセットで実装することが必須です。

この手順で使うツール

Text Case Converter

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

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

正規表現で陥りやすいミスのトップは「貪欲マッチ(greedy)と非貪欲マッチ(lazy)の混同」です。`<.+>` はHTMLタグを取り出そうとすると行全体にマッチしてしまいます。`<.+?>` と `?` を付けることで最短マッチになり意図通りに動きます。次に多いのが「ドット(.)が改行にマッチしない」問題です。複数行にわたるパターンを書く場合は `s`(dotAll)フラグを追加します。また、`^` と `$` は通常「文字列全体の先頭・末尾」を指しますが、`m`(multiline)フラグを付けると「各行の先頭・末尾」になるため、意図によって使い分けが必要です。パフォーマンス面では「カタストロフィックバックトラッキング」という問題があり、ネストした繰り返し(`(a+)+` など)が特定の入力で指数関数的に遅くなることがあります。日本語を扱うときは `u` フラグも覚えておくと便利です。`u` を付けると `\p{sc=Han}`(漢字)や `\p{sc=Hiragana}`(ひらがな)のように文字の種類で指定でき、絵文字のようなサロゲートペアも1文字として扱われます。一方で `\w` は `u` を付けても英数字とアンダースコアだけで、日本語には当たりません。Regex Studio では g・i・m・s・u のフラグを切り替えて、マッチの変化をその場で確かめられます。

この手順で使うツール

Regex Studio

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

まとめ

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

このツールで試す

Regex Studio

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

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

使ってみる →

BOOTH

Text Case Converter

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

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

使ってみる →

BOOTH

String Inspector

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

テキストUnicodeエンコード開発者向け

使ってみる →

BOOTH

関連ガイド