15

我正在尝试使用 Mx replace-regexp 替换 emacs 上所有出现的整个单词(比如 foo)。

问题是我不想替换 foo 在下划线单词中的出现,例如 word_foo_word

如果我使用 \bfoo\b 来匹配 foo 那么它将匹配带下划线的字符串;因为据我了解,emacs 认为下划线是单词边界的一部分,这与 Perl 等其他 RegEx 系统不同。

正确的方法是什么?

4

2 回答 2

12

正则表达式\<foo\>or仅当它前面或后面没有单词组成字符时才\bfoo\b匹配(语法代码,通常是字母数字,因此它匹配 in但不匹配 in )。foo wfoo_barfoo1

从 Emacs 22 开始,正则表达式仅在其前面或后面没有符号组成字符时才\_<foo_bar\_>匹配。foo_bar符号成分不仅包括单词成分(字母数字),还包括标识符中允许的标点符号,这意味着大多数编程语言中的下划线。

于 2011-05-09T19:21:29.963 回答
5

你写了:

据我了解,emacs 认为下划线是单词边界的一部分,这与其他正则表达式系统不同

下划线的处理,就像 emacs 中的所有其他内容一样,是可配置的。这个问题:
如何使前向词,后向词,将下划线视为单词的一部分?

……反过来问。

我认为您可以通过更改语法表中下划线的语法来解决您的问题,使它们不是单词的一部分,然后进行搜索/替换。

为此,您需要知道您正在使用的模式,以及该模式的语法表的名称。在 C++ 中,它会是这样的:

(modify-syntax-entry ?_ "." c++-mode-syntax-table)

点表示“标点符号”,表示不是单词的一部分。有关更多信息,请尝试M-x describe-functionmodify-syntax-entry

于 2011-05-09T12:16:11.737 回答