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