emacs の正規表現で ("[", "]" 以外の1文字) を表現する

emacsの M-C-% (query-replace-regexp) で

a[index_i] = 1

のような文章を

a(index_i) = 1

文章に変換したいことがあった。

このとき置換のクエリを \[\([^[]]*\)\] -> (\1) としても上手く行かない。 なぜなら [^[]] という正規表現が表すのは (”[“以外の1文字 + “]”) であって、 こちらの意図する (”[”, “]” 以外の1文字) とは異なっているからだ。

じゃあエスケープすればいいだろうと思って [^\[\]] としてもこれも上手く行かない。 [] の中にある文字はエスケープされるので、 この正規表現が表すのは (”\”, “[”, “]” 以外の1文字) だからだ。

解決法はマニュアルにあった。 emacs の正規表現では [...] 中の最初の文字が “]” だった場合はエスケープされるとのことなので、 (”[”, “]” 以外の1文字)を表す正規表現は [^][] となる。

よって、冒頭の変換を行うクエリは \[\([^][*\)\] -> (\1) となる。

参考資料

Regexp Special - GNU Emacs Lisp Reference Manual