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

ncp*_*ips 0 regex vim

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

    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/那么它将替换aWordToRemoveTEST并且保留前导空白区域和尾随分叉完整.

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

为什么要\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/

Wel*_*bog 6

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

你可以试试:s/[a-zA-Z]*//g,在第一次更换后会继续尝试.

Kleene closure(*)无法匹配.与你的类似的表达式将起作用:s/[a-zA-Z][a-zA-Z]*//,它保证至少有一个字母匹配,防止它在匹配第一个空字符串时停止.实际上,这很常见,因此操作符a+aa*大多数正则表达方言的简写.

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

  • 在vim中,你需要在`+`之前加一个反斜杠.Vim很有趣. (2认同)