Emacs Lispの正規表現における \A, \z

s.elのソースを読んでいたとき、発見したので
記事に残しておきます。


"\A"というのは文字列の先頭、"\z"というのもは文字列の末尾にマッチする
アンカーです。"^", "$"は行頭、行末を意味し、1列しかない文字列だと
同じ意味ですが、複数行を扱うとき意味が変わってしまいます。

"\A" = "\`", "\z" = "\'"

  • "\A"に相当するものが、"\`"(バックスラッシュ + バッククォート)、
  • "\z"に相当するものが、"\'"(バックスラッシュ + クォート)


文字列に現れる場合は "\"は "\\"になりますので、実質 "\\`", "\\'"
になります。

"\\`"と "^"で結果が違うことがわかります。

(let ((str "aa\naa"))
  (replace-regexp-in-string "\\`aa" "bb" str)) ; => "bb\naa"

(let ((str "aa\naa"))
  (replace-regexp-in-string "^aa" "bb" str)) ; => "bb\nbb"

"\\'"と "$"も同様です。

(let ((str "cc\ncc"))
  (replace-regexp-in-string "cc\\'" "dd" str)) ; => "cc\ndd"

(let ((str "cc\ncc"))
  (replace-regexp-in-string "cc$" "dd" str)) ; => "dd\ndd"


文字列の中に入っていると恐ろしく見づらいという問題があるのですが、
Emacs Lisp正規表現でも "\A", "\z"に相当するものが使えることが
わかりました。


まあマニュアルをちゃんと読んだら書いていたので、これからは
ちょくちょく参考にしていこうかと思います。