Vi中的Regex:如何在组内使用字符类?(例如[\ s \ w])


15

在Vim中,字符类\s与任何空白字符匹配。当我在组中使用这些特殊字符时,例如,[\s\w]它与任何单个空格或单词字符都不匹配,则与s或匹配w

如何在组内使用字符类?


8
与某些正则表达式引擎的实现不同,Vim似乎不支持该表示法。[[:space:][:alnum:]_]可以用来近似估算\s和的集合\w
Peter Lewerin

@PeterLewerin请发布答案。
Christopher Bottoms

@ChristopherBottoms:完成。
彼得·勒维林

Answers:


11

这不是一个组,而是一个范围,在Vim中,您不能使用字符类(尽管在其他正则表达式实现中也是可能的,例如python)。您必须改为使用替代

/\(\w\|\s\)

要么:

/\v(\s|\w)

(或者,在提出的解决方案通过彼得Lewerin)。


2
仅仅因为可以在字符类中构造一个无效范围并不意味着就不可能\s在字符类中使用类似的东西。Vim的regex实现恰好做出了这一选择,但其他实现允许您使用[\s]
jamessan

@VanLaser如果您使用此信息编辑答案([\ s]是其他正则表达式实现中的一种可能,但vim中不是),我会接受您的答案!
John HK

(没事,加)
VanLaser

11

与某些正则表达式引擎的实现不同,Vim似乎[\s\w]在集合中不支持该符号()。但是,可以使用POSIX字符类表达式

  • [:blank:]与相同\s
  • [:space:]匹配的空白字符数量大于\s,并且似乎等效于\_s
  • [:alnum:]近似 \w,但与下划线(_)不匹配。

因此,您想要的集合可以写为[[:blank:][:alnum:]_][[:space:][:alnum:]_]

我没有通过测试验证了这一点,但它记录了:h regexp:h /character-classes:h /collection

可移植性说明:在其他正则表达式引擎中,\s通常与Vim中的[:space:](或\_s)相同。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.