在vim正则表达式中,是否有一种方法可以允许在字符集中使用\w?

4
抱歉,这是一个相当简单的问题,但我无法有效地搜索。基本上,我希望:s/\v\w+/foo/与放置\w在字符集中的:s/\v[\w]+/foo/的行为相同,但后者没有匹配任何内容。是否有启用此功能的标志?这个不被支持吗?顺便说一下,我知道[:alnum:]之类的东西,或者我可以使用[a-zA-Z]或类似的东西(可能带有下划线,我记不清了),但希望想要使用一致、快捷的符号表示法。
1个回答

7
不行,你会在 :help /[ 找到这个信息,实际上就在 :help /\] 附近。
  - The following translations are accepted when the 'l' flag is not
    included in 'cpoptions' {not in Vi}:
    ...
    NOTE: The other backslash codes mentioned above do not work inside
    []!

\w 的等效集合是 [_[:alnum:]]。您也可以将 \w 与集合结合使用,例如:\%(\w\|[...]\)


我刚回来看到这个,决定不喜欢这个未实现的事实,你知道这是否被认为是vim中的一个bug吗(我在这里找不到任何信息)还是出于某种特定原因?我想要研究修复这个问题(因为我认为它是一个问题,不一致的语法),但需要确认它不是出于我不理解的某些原因。 - Mike H-R
这不是一个错误,regexp集合内的规则只是不同而已。我不知道还有哪个regexp引擎允许这样做。 - Ingo Karkat
1
而且您将无法处理所有的\x原子:例如,\d匹配数字,但在集合内,[\d123]包括一个十进制代码点字符。这是您无法解决的冲突,我认为Bram不会接受不完整的解决方案(但如果必须,请在vim_dev上咨询)。 - Ingo Karkat
不,谢谢。这就是我在这里询问的原因,试图理解为什么它不被允许。我不知道十进制代码点的情况。 - Mike H-R
此外,一般PCRE也支持这个(Ruby示例:"hello".match /[\w]+/ #=> #<MatchData "hello">, Perl示例:echo foo |perl -ne 'print if /[\w]+/' #=> foo文档链接(在字符类下)。 - Mike H-R
有趣的发现,它符合 Perl 的 TIMTOWTDI 方法。显然,他们没有这个冲突。 - Ingo Karkat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接