首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >emacs lisp中的空字符串正则表达式

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

Stack Overflow用户
提问于 2016-05-20 13:41:13
回答 1查看 426关注 0票数 0

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

代码语言:javascript
复制
(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时:

代码语言:javascript
复制
abcd abcd
abcd 11.11

regexp \_> (注意,只有一个反斜杠)和rep X替换后的结果区域是:

代码语言:javascript
复制
abcdX abcdX
abcdX 11.11X

我在这里错过了什么?

EN

回答 1

Stack Overflow用户

发布于 2016-05-20 14:58:17

它看起来像replace-regexp-in-string中的一个bug。

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

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

我建议您用一个简单的循环替换对replace-regexp-in-string的调用。实际上,我建议您不要剪掉字符串并执行如下操作:

代码语言:javascript
复制
(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))))
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37348248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档