Emacs regexp中字符串的开头和结尾

时间:2011-09-27 16:21:01

标签: regex emacs elisp

哪些字符表示带有换行符的字符串的开头和结尾?我正在写一个修剪函数:

(defun trim (str)
  (if (string-match "^[[:space:]]*\\(.+?\\)[[:space:]]*$" str)
      (match-string 1 str)
      str))

但是使用像“first / nnext”这样的字符串(来自shell-command-to-string)它只返回“first”。参考手册说:

  

当匹配字符串而不是缓冲区时,'^'在开头匹配   字符串或换行符之后。

\\',左边是缓冲区的开头/结尾,所以它只是从字符串中返回任何内容。因此,如果可能的话,如何指出字符串的“绝对”开头?

1 个答案:

答案 0 :(得分:4)

缓冲区或字符串的开头是\\`。并\\'结束。见manual

但是,我认为你的困难的根源不是锚。 [:space:] char类根据当前语法表匹配不同的字符。要使用[:graph:]可靠地匹配非打印或打印字符。见char class

.也不会与换行符匹配。

E.g。

(let ((str " \n a\nbc \n "))
  (string-match "\\`[^[:graph:]]*\\(\\(?:.\\|\n\\)+?\\)[^[:graph:]]*\\'" str)
  (match-string 1 str))