一括置換:正規表現・キャプチャグループ・一致件数の確認
元のテキストを貼り付け、検索する文字列と置換後の文字列を入力します。正規表現を使うときは「正規表現」をオンにし、置換側で $1 のようにキャプチャグループを参照します。先に一致件数を確認してから「すべて置換」を実行してください。入力欄は書き換えられず、結果は出力欄にだけ表示されます。
一括置換が向いている場面
書き出したデータには、全角の括弧、連続した空白、改行しない空白(U+00A0)が混ざりがちです。数十か所を手で直すのは遅く、漏れも出ます。1つのパターンでまとめて整理するのが定石です。
形式の統一もよくある作業です。2024-01-05 をすべて 2024/01/05 に変える、電話番号の先頭に国番号を足しつつ元の数字をキャプチャグループで残す、といった処理です。
対象を絞った置換もあります。ログの中で状態コード 500 だけを 503 に変え、他の数字には触れないケースです。パターンで境界を決めるほうが、部分文字列をすべて置換するより安全です。
- 全角・半角の混在や連続した空白、U+00A0 を整理する
- 日付、電話番号、番号の形式を統一する
- 一致した部分の前後に文字を足し、元の値は残す
- 似た文字列に触れず、特定のパターンだけを置換する
失敗しないための手順
置換の前に一致件数を確認してください。範囲が広すぎる(触れたくない文字まで数えている)と狭すぎる(1件も一致せず、実質何も起きていない)の両方が、件数を見るだけで分かります。
丸括弧でグループを作り、置換側で $1、$2 のように参照します。$& は一致した全体を表します。通常の(正規表現ではない)モードでも同じ置換構文が使われるため、そこでも $& は展開されます。文字としてのドル記号を出したいときは $$ と書きます。
存在しないグループを参照してもエラーにはなりません。括弧が1組しかないのに $2 と書くと、$2 がそのまま結果に残ります。結果に $2 が出てきたら、グループ番号を数え間違えている可能性が高いです。
正規表現は g と任意の i だけでコンパイルされ、m、s、u はありません。そのため ^ と $ はテキスト全体の先頭と末尾にしか一致せず、. は改行をまたがず、\p{L} は普通の文字 p、\u{1F600} は文字列 u{1F600} として扱われます。Unicode プロパティやコードポイント指定が必要な場合は、\uD83D\uDE00 のようなサロゲートペアに書き換えるか、文字そのものを貼り付けてください。
正規表現のコンパイルに失敗した場合、置換は実行されず、出力欄は前回の結果のままです。元のテキストが書き換わることもありません。ただしエラーはブラウザのコンソールにしか出ないことがあり、画面上は「押しても反応しない」ように見えます。まず括弧や角括弧の対応を確認してください。
欲張りな一致も定番の落とし穴です。<b>.*</b> は最初の <b> から最後の </b> までを飲み込み、<b>.*?</b> なら各ペアに一致します。いきなり全体を置換せず、小さなサンプルで結果を確認してから実行してください。後から戻すよりはるかに安く済みます。
- 先に一致件数を確認し、範囲を確かめてから置換する
- グループ番号は開き括弧の順に付く
- 置換側の $ に注意。文字のドル記号は $$
- m/s/u なし:^ $ は行単位ではなく、. は改行をまたがない
代替手段と限界
行単位の ^ $ や s フラグ、Unicode プロパティが必要な場合は、エディタの正規表現置換(VS Code、Sublime)か、コマンドラインの perl -0777 -pe、sed を使ってください。フラグが使え、大きなファイルも扱えます。
条件によって置換内容を変える、新しい値を計算するといった場合は、スクリプトを書くほうが確実です。長い正規表現は検証が難しく、次の修正で壊れやすくなります。
このツールはすべてをプレーンテキストとして扱います。HTML、CSV、JSON の構造は解析しないため、属性や特定の列だけを狙っても別の箇所に当たることがあります。数 MB を超えるテキストでは目に見えて遅くなります。データ移行ではなく、目で確認できるテキストの整理に向いています。
- 複数行・s フラグ → エディタか perl/sed
- 条件付きの置換や値の計算 → スクリプト
- 構造化データ → 解析してから。正規表現で切断しない
よくある質問
正規表現を間違えると元のテキストが壊れますか?
壊れません。入力欄の内容が書き戻されることはなく、結果は出力欄にだけ表示されます。正規表現のコンパイルに失敗した場合は置換そのものが実行されず、出力欄は前回の結果のままです。問題は、エラーがブラウザのコンソールにしか表示されないことがある点です。括弧や角括弧の対応が取れていないと、押しても反応しないように見えます。
\p{L} や \u{1F600} が一致しないのはなぜですか?
正規表現は new RegExp に g と任意の i だけを渡して構築しており、u フラグがないためです。\p は普通の文字 p、\u{1F600} は文字列 u{1F600} として扱われ、エラーにはならず一致もしません。Unicode プロパティやコードポイント指定を使いたい場合は、\uD83D\uDE00 のようなサロゲートペアに書き換えるか、実際の文字を貼り付けてください。
置換欄の $1 や $& は何ですか?第2グループがない場合はどうなりますか?
$1 は1番目のキャプチャグループ、$& は一致した全体、$$ は文字としてのドル記号です。存在しないグループ(括弧が1組しかないのに $2)を参照すると、$2 がそのまま結果に残ります。通常の(正規表現ではない)モードでも同じ置換構文が使われるため、そちらでも $& は展開されます。
関連ツール:Find and Replace