Emacsの正規表現編集モード re-builder とややこしいバックスラッシュ問題について。


Emacsの re-builder を使うと、正規表現にマッチする部分をリアルタイムにカラー表示してくれる。

M-x re-builder 起動
C-c C-q 終了

便利。便利なんだけど、空白にマッチする正規表現を書こうとして混乱した。

re-builder デフォルトはreadシンタックス。

re-builder にはシンタックス切り替えというのがある。

C-c TAB

でシンタックスを選択する。シンタックスは次の5種類。

シンタックスのデフォルトはread。正規表現のバックスラッシュはエスケープしなければならない。\\w みたいに。

独特な空白の正規表現

readシンタックスで \s と書くと、うまいこと空白にマッチしてしまう。これで混乱した。\s は正規表現パターンとして空白にマッチしているわけではない。文字列としてエスケープシーケンスが展開されている。\sが展開されるのは、

M-: (message "abc\sdef")

などとして確認できる。

正規表現で空白にマッチさせたいなら、Emacs独特の表現で、

\\s-
\\s(空白)

と書く必要がある。

stringシンタックス

re-builderのシンタックスをstringに切り替えると、バックスラッシュ1個モードになる。

C-c TAB string

でstringシンタックスに切り替え。これで

\s → invalid (不正)
\s- → 空白にマッチ

のように動作する。

通常ミニバッファで入力する正規表現は、バックスラッシュは1個で良い。

  • M-x replace-regexp
  • M-x search-forward-regexp
  • M-x isearch-forward-regexp

などでは、バックスラッシュは1個しか必要ない。文字列としてのエスケープシーケンスは展開されない。

まとめ

Emacs lispを書いているのでなければ、re-builderはstringシンタックスに切り替えて使う。

C-c TAB string

複雑な正規表現を編集をするのでなければ、re-builderよりisearch regexpの方が便利だと思った。

C-u C-s