为什么`[a-zA-Z] *`与带有前导空格的单词不匹配?

时间:2016-06-16 14:32:57

标签: regex vim

给出一个像这样的字符串:

    aWordToRemove;

把它变成这个:

    TEST;

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

但是,如果我运行:s/[a-zA-Z]\w*/TEST/,则会将aWordToRemove替换为TEST并保留前导空格和尾部分号。

为什么第一个正则表达式找不到该单词是否有前导空格?

为什么在\w工作之前放置*

修改

Vim似乎很挑剔。以下是一些有效且无法正常运行的正则表达式。

工作正则

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

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

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

Not Working Regexes

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

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

2 个答案:

答案 0 :(得分:6)

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

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

Kleene闭包(*)无法匹配。与你的一样,类似的表达式是:s/[a-zA-Z][a-zA-Z]*//,它保证至少匹配一个字母,防止它在匹配第一个空字符串时停止。实际上,这很常见,因为在大多数正则表达式方言中,运算符a+aa*的简写。

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

答案 1 :(得分:3)

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

Vim将magic设置为默认值。 magic是BRE -like ,这意味着,你必须逃避一些字符以赋予它们特殊含义,否则,它们只是文字字符。像( ) | + ...如果我们谈论这一点,它就像BRE一样。

如果你想制作正则表达式ERE或PCRE -like ,你可以在你的模式之前添加\v,因此::s/\v[...]+/whatever/g将起作用。在这个very magic模式中,你必须逃避那些具有特殊含义的字符才能获得字面值。

我建议你阅读vim magic doc,有一张表来比较不同的魔法模式。你可以做一些测试。