为什么"[a-zA-Z]*"与前导空格不匹配?



给定一个字符串,如下所示:

aWordToRemove;

把它变成这样:

TEST;

如果我:s/[a-zA-Z]*/TEST/运行命令,那么它与任何内容都不匹配。

但是,如果我运行:s/[a-zA-Z]w*/TEST/那么它将用TEST替换aWordToRemove,并保留前导空格和尾随分号不变。

如果第一个正则表达式具有前导空格,为什么找不到单词?

为什么把w放在*之前起作用?

编辑:

维姆似乎很挑剔。以下是一些工作和不工作的正则表达式。

工作正则表达式

s/[a-zA-Z]w*/TEST/

s/[a-zA-Z][a-zA-Z]*/TEST/

s/[a-zA-Z]+/TEST/

不工作正则表达式

s/[a-zA-Z]*/TEST/

s/[a-zA-Z]+/TEST/

因为它在行开始和第一个空格之间找到空字符串,并将其替换为空字符串,然后停止。

您可以改为尝试:s/[a-zA-Z]*//g,这将在第一次替换后继续尝试。

克莱尼闭包(*)不能匹配任何东西。一个类似的表达式,像你的,可以工作是:s/[a-zA-Z][a-zA-Z]*//,它保证至少匹配一个字母,防止它在匹配第一个空字符串时停止。事实上,这非常普遍,以至于运算符a+是大多数正则表达方言中aa*的简写。

这就是:s/[a-zA-Z]w*//起作用的原因,因为它必须至少匹配一个字母才能消耗更多。

要学习vimregex,首先应该学习magicvery magicno magic:h magic以查看详细信息。

Vimmagic设置为默认值。magic是类似 BRE,这意味着,您必须转义一些字符才能赋予它们特殊含义,否则,它们只是字面字符。( ) | + ...如果我们谈论这一点,它与 BRE 相同。

如果你想使正则表达式 ERE 或 PCRE类似,你可以在模式之前放一个v,这样::s/v[...]+/whatever/g将起作用。在这种very magic模式下,您必须转义那些具有特殊含义的字符才能具有文字价值。

我建议你阅读vimmagic文档,有一张表格,比较不同的魔法模式。你可以做一些测试。

最新更新