2011-09-27 115 views
3

指示字符串开头和结尾的字符是什么?我正在写一个装饰功能:Emacs正则表达式中字符串的开始和结尾

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

但随着像“第一/ n下一个”(从shell-command-to-string有)的字符串返回只有“第一”。参考手册中说:

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

\\'而左边的一个用于缓冲区的开始/结束,所以它只是简单地从字符串中返回任何内容。因此,如果可能,如何指示字符串的“绝对”开始?

回答

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)) 
+0

感谢您的纠正。然而,'\\'[[:space:]] * \\(。+?\\)[[:space:]] * \\''(在开始时使用“\\”)返回原始字符串,不要在开始和结束时切断'\ n's。 –

+0

问题不在于锚点,而在于您的正则表达式。 [:space:]与换行符不匹配。我会修改我的答案。 –

+0

“'[:space:]'它匹配任何具有空白语法的字符(请参阅语法类表)。” (http://www.gnu.org/software/emacs/elisp/html_node/Char-Classes.html)。 “语法类:空白字符...在几乎所有主要模式中,空格,制表符,换行符和换页符都被分类为空格。” (http://www.gnu.org/software/emacs/manual/html_mono/elisp.html#Syntax-Class-Table)。希望你的回答在这种情况下有所帮助。 –

相关问题