给出一个像这样的字符串:
aWordToRemove;
Run Code Online (Sandbox Code Playgroud)
把它变成这个:
TEST;
Run Code Online (Sandbox Code Playgroud)
如果我运行该命令,: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/
不工作的正则表达式
s/[a-zA-Z]*/TEST/
s/[a-zA-Z]+/TEST/
因为它在行开头和第一个空格之间找到空字符串,并用空字符串替换它,然后停止.
你可以试试:s/[a-zA-Z]*//g,在第一次更换后会继续尝试.
Kleene closure(*)无法匹配.与你的类似的表达式将起作用:s/[a-zA-Z][a-zA-Z]*//,它保证至少有一个字母匹配,防止它在匹配第一个空字符串时停止.实际上,这很常见,因此操作符a+是aa*大多数正则表达方言的简写.
这就是为什么:s/[a-zA-Z]\w*//有效的原因,因为它必须在消耗更多之前至少匹配一个字母.