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

Posted

技术标签:

【中文标题】Emacs 正则表达式 wordWord 边界(特别是关于下划线)【英文标题】:Emacs regex wordWord boundary (specifically concerning underscores) 【发布时间】:2011-08-21 15:23:46 【问题描述】:

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

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

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

正确的方法是什么?

【问题讨论】:

【参考方案1】:

正则表达式 \<foo\>\bfoo\b 匹配 foo 仅当它前面或后面没有单词组成字符(syntax code w,通常是字母数字,所以它匹配 foo_bar 但不匹配 @ 987654328@).

从 Emacs 22 开始,正则表达式 \_<foo_bar\_> 仅在其前面或后面没有符号组成字符时才匹配 foo_bar。符号成分不仅包括单词成分(字母数字),还包括标识符中允许的标点符号,即大多数编程语言中的下划线。

【讨论】:

谢谢 _ 【参考方案2】:

你写的:

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

下划线的处理,就像 emacs 中的所有其他内容一样,是可配置的。本题:How to make forward-word, backward-word, treat underscore as part of a word?

...反问。

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

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

(modify-syntax-entry ?_ "." c++-mode-syntax-table)

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

【讨论】:

以上是关于Emacs 正则表达式 wordWord 边界(特别是关于下划线)的主要内容,如果未能解决你的问题,请参考以下文章

emacs 主要模式为正则表达式前面的行定义字体锁定

javascript正则表达式匹配3个数字和3个字母

如何使用 DFA 正则表达式匹配器实现正则表达式断言/环视(即 \b 样式字边界)

什么是正则表达式中的单词边界?

[正则表达式]基础工具书篇 关于边界

Emacs中那些不常用的行操作命令