Emacs正则表达式wordWord边界(特别是关于下划线)

时间:2011-05-09 11:48:25

标签: regex replace emacs boundary

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

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

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

什么是正确的方法?

2 个答案:

答案 0 :(得分:12)

正则表达式\<foo\>\bfoo\b只有在foo w字符组成字符(syntax code foo_bar之前或之后才会匹配foo1,所以它匹配foo_bar但不匹配_)。

从Emacs 22开始,正则表达式\_<foo_bar\_>只有在符号组成字符之前或之后才匹配_。符号成分是单词成分或具有语法{{1}}的字符。大多数编程模式将{{1}}定义为符号成分。

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

点表示“标点符号”,表示不是单词的一部分。有关详情,请在M-x describe-function上尝试modify-syntax-entry