【问题标题】:\w doesn't work in vim search replace but a-zA-Z does? [duplicate]\w 在 vi​​m 搜索替换中不起作用,但 a-zA-Z 可以吗? [复制]
【发布时间】:2018-05-01 02:44:33
【问题描述】:

tldr

[a-zA-Z\.-] 在 Vim 正则表达式搜索替换中有效,但 [\w\.-] 无效。

我正在搜索的文本:

1 string.here   blah blah
24  another-string.here   blah.
1523    another-string.goes.here.  blah123

期望的输出

string.here
another-string.here
another-string.goes.here

我的问题

为什么会这样:

:%s/\v^\d+\s+([a-zA-z\.-]+)\s+.*/\1/g

但这不是:

:%s/\v^\d+\s+([\w\.-]+)\s+.*/\1/g

E486:找不到模式:%s/\v^\d+\s+([\w\.-]+)\s+.*/\1/g

两者之间的唯一区别是方括号内的a-zA-Z\w。但是\w 等于 a-zA-Z 不(加上此示例文本中没有的其他一些非空白字符)?

我正在使用默认的 vim。未修改。无论 Ubuntu 附带什么。

非 vim 平台

当我尝试使用 atom 文本编辑器而不是 vim 时,两个表达式都可以工作。

搜索:^\d+\s+([a-zA-z\.-]+)\s+.* 替换:$1

当我尝试使用RegExr 时,两个表达式都有效。 (虽然我必须添加多行标签)

我尝试过的其他事情

我的理解是\v 是避免逃离地狱所必需的。我试过没有它:

:%s/^\d\+\s\+\([a-zA-Z\.-]\+\)\s\+.*/\1/g

作品

:%s/^\d\+\s\+\([\w\.-]\+\)\s\+.*/\1/g

不起作用。 (“未找到模式”)

我也尝试添加 m 标志(所以结尾是 /gm),但没有奏效

E488:尾随字符

我也试过不使用^

:%s/\d\+\s\+\([\w\.-]\+\)\s\+.*/\1/g

E486:找不到模式:\d\+\s\+\([\w\.-]\+\)\s\+.*

我也尝试过使用\\w 而不是\w

:%s/\d\+\s\+\([\\w\.-]\+\)\s\+.*/\1/g

E486:找不到模式:\d\+\s\+\([\\w\.-]\+\)\s\+.*

我也尝试过使用\[ \] 而不是[ ]

:%s/\d\+\s\+\(\[\\w\.-\]\+\)\s\+.*/\1/g

E486:找不到模式:\d\+\s\+\(\[\\w\.-\]\+\)\s\+.*

【问题讨论】:

  • vim 不支持字符类中的转义字符

标签: regex search vim replace


【解决方案1】:

[a-zA-Z\.-] 在 Vim 正则表达式搜索替换中有效,但 [\w\.-] 无效。

[a-zA-Z\.-]字符的集合,包含:

  • az 的每个字符,
  • AZ 的每个字符,
  • 角色.
  • 和字符-

:help /collection 很遗憾没有明确说明这一点,但是像 \w 这样的字符类被解释为“转义的w”,因此是“普通的w”,所以[\w\.-] 实际上只是[w\.-]不是你想要的:

  • 角色w,
  • 角色.
  • 和字符-

【讨论】:

  • 好吧,这是有道理的。我如何可以做到[\w]?我已经尝试过[\\w]。在这种情况下,我可以使用a-zA-Z,但我想知道在输入全家人的情况下(例如\S
  • 你为什么要[\w][\S]?如果它有效,它将严格等同于\w\S,所以不会有任何好处。
  • 作为替代方法,请参阅:help [:alnum:] 和相关的字符类表达式。
  • 对不起,当我说[\w] 时,我指的是一个有\w 和其他东西的组。 (例如[\w\.])。 [[:alnum:]\.-] 确实有效。谢谢。但是,如果我需要学习一组定制的长魔术字符串,因为 Vim 无法理解规范的正则表达式,我看不出使用 Vim 的意义。我只是要回到纳米。
  • 你可以随意使用任何你想要的工具,也可以不花任何精力去学习它。
猜你喜欢
  • 1970-01-01
  • 2022-01-07
  • 2018-06-22
  • 1970-01-01
  • 2010-12-13
  • 2018-09-30
  • 2019-03-05
  • 1970-01-01
相关资源
最近更新 更多