2011-05-09 75 views
10

我试图用M-x replace-regexp替换所有在emacs上的整个单词(比如foo)。Emacs正则表达式字边界(具体涉及下划线)

的问题是,我不想把foo换成的出现在下划线词,如word_foo_word

如果我使用\ bfoo \ b键匹配FOO然后将匹配的下划线串;因为据我所知,emacs认为下划线是字边界的一部分,与其他正则表达式系统(如perl)不同。

什么是正确的处理方式?

感谢

回答

5

您写道:

我了解的emacs认为底线是字边界的一部分,这是其他正则表达式系统

下划线的治疗,如不同emacs中的所有其他内容都是可配置的。这个问题:
How to make forward-word, backward-word, treat underscore as part of a word?

...问相反。

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

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

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

的点表示“标点符号”,这意味着不是一个单词的一部分。欲了解更多信息,请在modify-syntax-entry上尝试M-x describe-function

+0

查看语法表感谢。 – nsimplex 2011-05-10 11:47:28

9

的正则表达式或\<foo\>匹配\bfoo\bfoo当它不是由字构成字符之前或之后(syntax codew,通常是字母数字,所以它在foo_bar匹配但不是在foo1)。

由于Emacs 22,正则表达式\_<foo_bar\_>匹配foo_bar只有当它没有前或后面有符号组成字符时。符号构成要么是词组成要么是语法为_的字符。大多数编程模式将_定义为符号组成部分。

+0

谢谢\ _ <运营商是我一直在寻找的。 – nsimplex 2011-05-10 11:47:59