Emacsの正規表現編集モード re-builder とややこしいバックスラッシュ問題について。
Emacsの re-builder を使うと、正規表現にマッチする部分をリアルタイムにカラー表示してくれる。
- Emacs で正規表現を使うなら re-builder を使おう - Higepon’s blog - Mona OS and Mosh
- re-builder: the Interactive regexp builder | Mastering Emacs
M-x re-builder 起動 C-c C-q 終了
便利。便利なんだけど、空白にマッチする正規表現を書こうとして混乱した。
re-builder デフォルトはreadシンタックス。
re-builder にはシンタックス切り替えというのがある。
C-c TAB
でシンタックスを選択する。シンタックスは次の5種類。
- read …… デフォルト。正規表現構文のバックスラッシュは2個必要。
- string …… バックスラッシュは1個で良い。
- sregex …… S式。
- lisp-re …… S式。
- rx …… S式。
シンタックスのデフォルトは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