给定一个字符串,如下所示:
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,首先应该学习magic
,very magic
和no magic
。:h magic
以查看详细信息。
Vimmagic
设置为默认值。magic
是类似 BRE的,这意味着,您必须转义一些字符才能赋予它们特殊含义,否则,它们只是字面字符。( ) | + ...
如果我们谈论这一点,它与 BRE 相同。
如果你想使正则表达式 ERE 或 PCRE类似,你可以在模式之前放一个v
,这样::s/v[...]+/whatever/g
将起作用。在这种very magic
模式下,您必须转义那些具有特殊含义的字符才能具有文字价值。
我建议你阅读vimmagic
文档,有一张表格,比较不同的魔法模式。你可以做一些测试。