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

时间:2011-09-08 17:50:46

标签: regex emacs replace

1)在从GUI编辑器调整到EMACS的过程中,我似乎无法找到一种明确的方法来为大多数编辑器执行相对简单的任务:查找和替换文本中的整个单词(非子串)并找到完全匹配。 M-x replace-string查找子字符串和整个单词。有没有这样做的正则表达式?

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

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

5 个答案:

答案 0 :(得分:8)

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

然后,正则表达式通常区分大小写。在大多数版本中,您可以通过将(?I)(?-i)添加到正则表达式中来明确区分大小写。但我不确定Emacs正则表达式是否可以做到这一点。

我不知道你的第三个问题。遗憾。

答案 1 :(得分: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))))

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

答案 2 :(得分:1)

首先,您能否在将来将多个问题放入单独的问题中?它使其他人更容易帮助您和将来有一些相同问题的其他用户从过去的答案中获得帮助。

  1. 请参阅@Tim的回答

  2. 请参阅C-h k M-%并阅读有关案例匹配的部分

  3. 在最后一场比赛后执行C-s会提示您最后一次,再次点击C-s 将从头开始。点击C-h i阅读文档,然后点击* Emacs,然后点击g Repeat Isearch RET,倒数第二段。

答案 3 :(得分:1)

对于问题2,如果搜索字符串全部为小写,则emacs默认情况下会执行不区分大小写的搜索。您可以通过将case-fold-search设置为nil来强制它进行区分大小写的搜索。您可以将其放在.emacs文件中:(setq case-fold-search nil)

答案 4 :(得分:1)

问题1(全字搜索) 在遇到角色\b时,@ Tim的答案中的_无效。似乎foo\b可以匹配Emacs中的foo_bar(当然它在Perl中无法匹配)。