Emacs 搜索带有下划线的单词不被视为单词边界[重复]

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

使用正则表达式

\bfoo\b
搜索单词
foo
时,结果包括
foo_a
a_foo
等单词。如何从结果中排除这些词?即,如何要求 emacs 不将下划线视为单词边界。

regex search emacs word-boundary
2个回答
6
投票

我终于找到了解决办法:

默认情况下,下划线 _ 不是单词组成字符(换句话说,它是单词边界)。 我们可以通过添加

将下划线定义为单词组成字符
 (modify-syntax-entry ?_ "w")

.emacs
文件中。

为了使其在主要模式(例如 python-mode)下工作,我们需要将此定义添加到模式挂钩中:

(defun mypython () (modify-syntax-entry ?_ "w"))
(add-hook 'python-mode-hook 'mypython)

参见这个

更新:

更准确地说,我们应该区分单词边界和符号边界。前者是

\b
,后者:符号的开始和结束分别是
\_<
\_>
(这很尴尬,以至于我使用Emacs多年都没有意识到它的存在)。大多数编程语言将下划线视为符号的一部分,因此问题的直接解决方案是使用
\_<foo\_>
作为搜索正则表达式。


0
投票

我不使用 EMAC,但在 Notepad++ 或 python 中

\bfoo\b
应该会给你所需的结果。 但由于它不适合你,所以这应该有效:
\b(?<!_)foo(?!_)\b

(?<!_) - negative look behind to ensure that _ does not precede
(?!_) - negative look ahead to ensure that _ does not follow

参见 演示

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