re-builder と query-replace-regexp で挙動が違う点

「query-replace-regexp」を実行する前に「re-builder」で確認するというのはとてもいい方法。
だけど両者ではタブに関する振るまいが違うようなので注意が必要。

例えば、以下のようなコードがあったとして (_ はタブのつもり)

1 _hogehoge
2 _fugafuga
3 _piyopiyo

これを次のように加工したい場合

hogehoge
fugafuga
piyopiyo


いきなり「M-x query-replace-regexp」(C-M-%)するのは不安だから
まず「M-x re-builder」で試しに正規表現を作ろうとする。
で、「^[0-9]+ \t」という正規表現を作ったとする。
これは、「re-builder」の上では「1 _」や「2 _」などに見事にマッチするのだけど
この正規表現を「query-replace-regexp」上でそのまま使うと今度はマッチしない。
「query-replace-regexp」では「\t」がタブ文字にマッチしないようだ。
じゃあどうすればいいかというと、そのまま直接タブを打てば OK。
つまり、今回の場合は「^[0-9]+ _」(_ はタブ)という正規表現を作るのが正しい。


まとめると、「re-builder」で作った正規表現に「\t」がある場合は、
「query-replace-regexp」するときには直接「タブ文字」に置き換えよう、ということ。


両者の挙動が違うのには何か理由があるんだろうけど詳細は不明。
また、「re-builder」上でタブを直接打ったときに
「query-replace-regexp」と同じように動作するのなら
両者の違いは無視してもいいと思うが、そんなこともないのでややこしい。


以下余談。
今回の例だと「C-x r k」(矩形領域を選択してキル)の方が早いけど
コードが何百行かある場合は、1桁のとき、2桁のとき、3桁のときで3回やらないとダメ。