emacsの M-C-% (query-replace-regexp) で
a[index_i] = 1
のような文章を
a(index_i) = 1
文章に変換したいことがあった。
このとき置換のクエリを \[\([^[]]*\)\] -> (\1) としても上手く行かない。
なぜなら [^[]] という正規表現が表すのは (”[“以外の1文字 + “]”) であって、
こちらの意図する (”[”, “]” 以外の1文字) とは異なっているからだ。
じゃあエスケープすればいいだろうと思って [^\[\]] としてもこれも上手く行かない。
[] の中にある文字はエスケープされるので、
この正規表現が表すのは (”\”, “[”, “]” 以外の1文字) だからだ。
解決法はマニュアルにあった。
emacs の正規表現では [...] 中の最初の文字が “]” だった場合はエスケープされるとのことなので、
(”[”, “]” 以外の1文字)を表す正規表現は [^][] となる。
よって、冒頭の変換を行うクエリは \[\([^][*\)\] -> (\1) となる。