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

问题描述 投票:14回答:2

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

问题是我不想在word_foo_word等下划线词中替换foo的出现

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

什么是正确的进行方式?

regex replace emacs boundary
2个回答
12
投票

regexp \<foo\>\bfoo\b只有当foo之前或之后没有单词组成字符时才会匹配syntax codew foo_bar,通常是字母数字,所以它匹配foo1而不是\_<foo_bar\_>)。

从Emacs 22开始,正则表达式foo_bar只有当它不在符号组成字符之前或后面时才匹配_。符号成分是单词成分或具有语法_的字符。大多数编程模式将How to make forward-word, backward-word, treat underscore as part of a word?定义为符号成分。


5
投票

你写了:

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

与emacs中的其他所有内容一样,下划线的处理是可配置的。这个问题: (modify-syntax-entry ?_ "." c++-mode-syntax-table)

......反过来问。

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

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

M-x describe-function

圆点表示“标点符号”,表示不是单词的一部分。有关更多信息,请在modify-syntax-entry上尝试qazxswpoi。

© www.soinside.com 2019 - 2024. All rights reserved.