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

nsi*_*lex 15 regex emacs replace boundary

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

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

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

什么是正确的进行方式?

Gil*_*il' 12

regexp \<foo\>\bfoo\b匹配foo仅当它不在单词构成字符之前或之后(语法代码 w,通常是字母数字,因此它匹配foo_bar但不在其中foo1).

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


Che*_*eso 5

你写了:

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

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

......反过来问.

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

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

(modify-syntax-entry ?_ "." c++-mode-syntax-table)
Run Code Online (Sandbox Code Playgroud)

圆点表示"标点符号",表示不是单词的一部分.欲了解更多关于这一点,尝试M-x describe-functionmodify-syntax-entry.