【问题标题】:Beginning and end of the string in Emacs regexpsEmacs 正则表达式中字符串的开头和结尾
【发布时间】:2011-09-27 16:21:00
【问题描述】:

用换行符表示字符串开头和结尾的字符是什么?我正在写一个修剪函数:

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

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

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

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

【问题讨论】:

    标签: regex emacs elisp


    【解决方案1】:

    \\` 表示缓冲区或字符串的开头。和\\' 结束。见manual

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

    . 也不会匹配换行符。

    例如

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

    【讨论】:

    • 感谢指正。但是\\'[[:space:]]*\\(.+?\\)[[:space:]]*\\'(以“\`”开头)返回的是原始字符串,不会切断开头和结尾的\ns。
    • 问题不是锚,而是你的正则表达式。 [:space:] 不匹配换行符。我会修改我的答案。
    • "'[:space:]' 这匹配任何具有空格语法的字符(参见语法类表)。 (gnu.org/software/emacs/elisp/html_node/Char-Classes.html)。 “语法类:空格字符...空格、制表符、换行符和换页符在几乎所有主要模式中都被归类为空格。” (gnu.org/software/emacs/manual/html_mono/…)。希望您的回答对这种情况有所帮助。
    • 嗯。呃,你对这个答案还是不满意吗? “几乎所有主要模式”都说得很清楚。每个主要模式都可以通过其语法表定义它认为空白的内容。
    • 感谢您的解决方案。我只是在字符串 inside 中挣扎。两种变体(空间和图形)都只返回第一个字符串。 (let ((str " \n ab\nc \n ")) (string-match "^[^[:graph:]]*\\(.+?\\)[^[:graph:]]*$" str) (match-string 1 str))。开头和结尾的换行符也被:space: 切断(至少在迷你缓冲区中)。但问题是如何在包含换行符的字符串的开头和结尾截断空格和换行符。
    猜你喜欢
    • 2013-08-04
    • 2017-09-17
    • 2015-04-27
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-19
    • 2015-03-20
    相关资源
    最近更新 更多