正規表現のエスケープを解除する方法:a\.b の読み方
人から渡された正規表現や、ログに残ったエスケープ済みの検索語は、a\.b や \[test\] のような形で読みにくいものです。エスケープを外せば、何に一致させたかったのかが見えます。
バックスラッシュを外したい場面
引き継いだコードや設定の正規表現は、どこかからコピーされたものが多く、バックスラッシュが大量に付いています。何を探しているのかを判断するには、普通の文字列に戻したほうが、頭の中で 1 文字ずつ変換するより速く、階層を読み違えません。
もう一つは比較です。ログにはエスケープされた検索語が残り、利用者は元の表記を報告します。両方の見た目が揃うまで、同じ語かどうかを確かめられません。解除して並べれば、違いがどこにあるか分かります。
- コードや設定にある正規表現を読む
- ログに残ったエスケープ済み検索語を復元する
- 文書でパターンに対応する元の文字列を示す
- 2 つのパターンが等価か確認する
外すのは 14 文字の前のバックスラッシュだけ
対象は決まった一覧です。ピリオド、アスタリスク、プラス、疑問符、キャレット、ドル記号、中括弧、丸括弧、縦棒、角括弧、そしてバックスラッシュ自身です。これらの直前にあるバックスラッシュだけを外し、それ以外はそのまま残します。
そのため \d、\w、\s、\n は変化しません。これらは「バックスラッシュ + 対象文字」の組み合わせではないからです。逆にバックスラッシュ 2 つは 1 つに戻ります。バックスラッシュ自身も一覧に含まれるためです。
- 対象は 14 文字の前のバックスラッシュのみ
- \d、\w、\n はそのまま残る
- バックスラッシュ 2 つは 1 つになる
- それ以外の文字は変更しない
解除後にパターンとして使えない理由
バックスラッシュを外すと、守られていた文字が再び特別な意味を持ちます。a\.b は a.b になり、点が任意の文字に一致するため、そのままパターンにすると元とは違う結果になります。一致させたい場合は元の版を残すか、もう一度エスケープしてください。
パスやコードでは誤って削除されることもあります。C:\dir\*.txt のような文字列では \* が不要なエスケープと見なされて消え、パスの意味が変わります。処理前に元を控え、結果と比べてから採用してください。
- 解除後はパターンとして使えない
- 読む・比べる・再編集する用途に向く
- Windows のパスのバックスラッシュは消える
- 元の版を控えてから処理する
よくある質問
解除した文字列をそのまま正規表現に使えますか?
使えません。バックスラッシュを外すと、エスケープされていた文字が再び特別な意味を持ち、元のパターンとは違うものに一致します。一致させたい場合は元の版を残すか、解除した文字列をもう一度エスケープしてください。
\d や \n が変わらないのはなぜですか?
一覧に含まれていないからです。外すのは 14 の特殊文字の前のバックスラッシュだけで、d、w、s、n はそこに入りません。\d のような並びは正規表現の文法の一部で、余分なエスケープではありません。
\u4e2d のような表記は元に戻せますか?
戻せません。これは Unicode のエスケープシーケンスで、u は 14 文字の一覧にないため、そのまま残ります。この種の符号化を戻すには、エスケープシーケンスを解釈できるツールや言語のデコード関数が必要です。
関連ツール:正規表現のエスケープ解除