给出一个像这样的字符串:
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/
答案 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,应首先学习magic
,very magic
和no magic
。 :h magic
查看详细信息。
Vim将magic
设置为默认值。 magic
是BRE -like ,这意味着,你必须逃避一些字符以赋予它们特殊含义,否则,它们只是文字字符。像( ) | + ...
如果我们谈论这一点,它就像BRE一样。
如果你想制作正则表达式ERE或PCRE -like ,你可以在你的模式之前添加\v
,因此::s/\v[...]+/whatever/g
将起作用。在这个very magic
模式中,你必须逃避那些具有特殊含义的字符才能获得字面值。
我建议你阅读vim magic
doc,有一张表来比较不同的魔法模式。你可以做一些测试。