我正在尝试使用 Mx replace-regexp 替换 emacs 上所有出现的整个单词(比如 foo)。
问题是我不想替换 foo 在下划线单词中的出现,例如 word_foo_word
如果我使用 \bfoo\b 来匹配 foo 那么它将匹配带下划线的字符串;因为据我了解,emacs 认为下划线是单词边界的一部分,这与 Perl 等其他 RegEx 系统不同。
正确的方法是什么?
正则表达式\<foo\>
or仅当它前面或后面没有单词组成字符时才\bfoo\b
匹配(语法代码,通常是字母数字,因此它匹配 in但不匹配 in )。foo
w
foo_bar
foo1
从 Emacs 22 开始,正则表达式仅在其前面或后面没有符号组成字符时才\_<foo_bar\_>
匹配。foo_bar
符号成分不仅包括单词成分(字母数字),还包括标识符中允许的标点符号,这意味着大多数编程语言中的下划线。
你写了:
据我了解,emacs 认为下划线是单词边界的一部分,这与其他正则表达式系统不同
下划线的处理,就像 emacs 中的所有其他内容一样,是可配置的。这个问题:
如何使前向词,后向词,将下划线视为单词的一部分?
……反过来问。
我认为您可以通过更改语法表中下划线的语法来解决您的问题,使它们不是单词的一部分,然后进行搜索/替换。
为此,您需要知道您正在使用的模式,以及该模式的语法表的名称。在 C++ 中,它会是这样的:
(modify-syntax-entry ?_ "." c++-mode-syntax-table)
点表示“标点符号”,表示不是单词的一部分。有关更多信息,请尝试M-x describe-function
。modify-syntax-entry