在Emacs中查找并替换整个单词(不是子串)

oct*_*cti 7 regex emacs replace

1)在我从GUI编辑器调整到EMACS的过程中,我似乎很难找到一种明确的方法来为大多数编辑器执行相对简单的任务:在文本中查找并替换整个单词(非子串)并找到确切的结果火柴.Mx replace-string查找子字符串以及整个单词.有没有这样做的正则表达式?

2)另外,有没有办法匹配精确的字符串?例如,如果我想用每个字母的确切情况替换myClaSs,我该怎么办?现在,replace-string将myclass与myCLasS匹配.正如我所说,只有案件中的第一个字母是匹配的.我假设一些正则表达式也照顾到了这一点.

3)是否可以选择进行环绕搜索?或者我总是要决定是做Cs(前进)还是Cr(后退)

Tim*_*ker 8

使用单词边界锚:\bfoo\b只匹配foo,而不是foobar.

然后,正则表达式通常区分大小写.在大多数版本中,您可以通过前置(?I)(?-i)正则表达式明确地使它们区分大小写.但我不确定Emacs正则表达式是否可以做到这一点.

我不知道你的第三个问题.抱歉.

  • 另外,`begin-of-buffer`指向本地标记环,搜索/替换命令也是如此.因此,在完成更换后,您可以使用两次"Cu SPC"(弹出本地标记环)返回到您开始的位置. (2认同)

Tre*_*son 6

所有其他答案都提供了可用于让Emacs做你想做的事情的信息.但您也可以使用自己的搜索/替换功能来执行您想要的操作:

(defun search-replace-ala-octi (tosearch toreplace)
  (interactive "sSearch for word: \nsReplace with: ")
  (save-excursion
    (goto-char (point-min))
    (let ((case-fold-search nil)
          (count 0))
      (while (re-search-forward (concat "\\b" tosearch "\\b") nil t)
        (setq count (1+ count))
        (replace-match toreplace 'fixedcase 'literal))
      (message "Replaced %s match(es)" count))))
Run Code Online (Sandbox Code Playgroud)

并将它绑定到你想要的任何键...

  • 我越想学习EMACS,我就越发现我必须学习LISP. (2认同)