emacs lisp中的空字符串正则表达式

时间:2016-05-20 13:41:14

标签: regex emacs elisp

我有这段代码来查找区域中的空字符串。

(defun replace-in-region (start end)
  (interactive "r")
  (let ((region-text (buffer-substring start end))
        (temp nil))
    (delete-region start end)
    (setq temp (replace-regexp-in-string "\\_>" "X" region-text))
    (insert temp)))

当我在一个区域上使用它时,无论所述区域的内容如何,​​它都会将其擦除,并给出错误“Args超出范围:4,4”。

当我在包含以下内容的区域中使用query-replace-regexp

abcd abcd
abcd 11.11

正则表达式 \_>(请注意,只有一个反斜杠)和 rep X替换后发生的4个结果区域是:

abcdX abcdX
abcdX 11.11X

我在这里缺少什么?

1 个答案:

答案 0 :(得分:2)

它看起来像replace-regexp-in-string中的错误。

它首先匹配原始字符串中的正则表达式。例如,它找到“abcd”的结尾。然后它选出匹配的子字符串,由于某些原因我不知道,重做子字符串上的匹配。在这种情况下,匹配失败(因为它不再跟着一个单词),但是它后面的代码假定它成功并且匹配数据已经更新。

请使用M-x report-emacs-bug报告此错误。

我建议你用简单的循环替换对replace-regexp-in-string的调用。事实上,我建议你不要删除字符串并执行以下操作:

(defun my-replace-in-region (start end)
  (interactive "r")
  (save-excursion
    (goto-char start)
    (setq end (copy-marker end))
    (while (re-search-forward "\\_>" end t)
      (insert "X")
      ;; Ensure that the regexp doesn't match the newly inserted
      ;; character.
      (forward-char))))