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

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

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

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

正确的方法是什么?

【问题讨论】:

    标签: regex replace emacs boundary


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多