Fixture、Flag、Replace プレビューによる Regex デバッグ

正規表現をテストする実践ワークフロー: サンプル行、global/multiline flag、capture group、regex を使うのをやめるべきタイミング。

regex バグの多くは構文エラーではなく、flag、改行、エンジンにおける「match」の意味についての誤った前提です。デモ文字列 1 つでハイライトされるパターンが、本番ログ、CSV export、国際化された名前では失敗することがよくあります。

このガイドは、基本的な \d[a-z] 構文は知っているが、リファクタや検証ルールを ship する前に信頼できる match が必要な開発者向けの再現可能なワークフローです。

パターンではなく fixture から始める

括弧を調整する前に、must-matchmust-not-match 行を集めます。

  • 実ログ行を数行(secret は redact)
  • 空または空白のみの入力
  • アプリが国際化対応なら Unicode 名や slug
  • 以前 false positive を起こした行

Regex Tester に貼り付け、編集中もセットを開いたままにします。緑のハイライト 1 つはテストスイートではありません。

複雑さを足す前に flag を確認する

1 行では動くがファイル全体では動かないとき、flag が原因であることが多いです。

症状試す flag
最初の match だけハイライトg (global)
^ / $ が行頭を無視m (multiline)
. が改行で止まるs (dotAll)
大文字小文字の意外な挙動i (ignore case)
surrogate pair / \p{...} の問題u (Unicode)

ship する flag をコードコメントや runbook に記録してください。将来の自分は /^ERROR/m が必要だった理由を覚えていません。

パターンをレイヤーで構築する

  1. 存在が分かる安定 prefix を anchor する(^timestamp= など)
  2. 可変部分は greedy な .* サンドイッチではなく character class で置き換える
  3. extract または replace するフィールドだけ capture group を追加する
  4. sed や IDE の replace-all を実行する前に、すべての fixture 行で replace 出力をプレビューする

意図の例: user_id=123userId: 123 に変える。$1 が間違った group に入るなら、本番データに触れる前に grouping を直す。

regex が間違ったツールであるタイミングを知る

regex はテキスト内の局所構造に向いています。入力が次の場合は parser を検討します。

  • ネストした HTML や XML
  • JSON や YAML ドキュメント全体
  • プログラミング言語

より大きな行内の URL query string では、まず URL Encoder で正規化し、期待する encoded 形状を match することを検討してください。

5 分レビューチェックリスト

  1. すべての fixture が期待どおり match または reject される
  2. flag が記録されている(gimsu またはその部分集合)
  3. 複数行 paste で replace プレビューを確認した
  4. 最悪ケース入力サイズをテストした(大きなログ paste)
  5. パターンを Python、Java、PCRE にコピーする場合は engine を記録した

関連学習

フィールドごとの文法、capture group、backtracking リスクについては Regular Expressions コース を参照してください。

まとめ

regex をコードのように扱います。fixture、flag、プレビュー、そして ship。 最速の修正は、ネストした quantifier を足すことではなく、しばしば gm を toggle することです。

関連ツール

この記事で使うツール

正規表現テスターregex / regexp / regular expressionURL エンコード / デコードurl / uri / encode

関連コース

正規表現 コースこの正規表現コースで学ぶ内容を整理します。

記事一覧へ戻る