使用正则表达式
\bfoo\b
搜索单词foo
时,结果包括foo_a
和a_foo
等单词。如何从结果中排除这些词?即,如何要求 emacs 不将下划线视为单词边界。
我终于找到了解决办法:
默认情况下,下划线 _ 不是单词组成字符(换句话说,它是单词边界)。 我们可以通过添加
将下划线定义为单词组成字符 (modify-syntax-entry ?_ "w")
在
.emacs
文件中。
为了使其在主要模式(例如 python-mode)下工作,我们需要将此定义添加到模式挂钩中:
(defun mypython () (modify-syntax-entry ?_ "w"))
(add-hook 'python-mode-hook 'mypython)
参见这个
更新:
更准确地说,我们应该区分单词边界和符号边界。前者是
\b
,后者:符号的开始和结束分别是\_<
和\_>
(这很尴尬,以至于我使用Emacs多年都没有意识到它的存在)。大多数编程语言将下划线视为符号的一部分,因此问题的直接解决方案是使用 \_<foo\_>
作为搜索正则表达式。
我不使用 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
参见 演示