在vim中搜索正则表达式时,我遇到了一种奇怪的行为:
我试图清理文件中多余的空格,并希望使用substitute命令.
当我对集合使用以下正则表达式时,vim也匹配单个空格:
\%[\s]\{2,}
Run Code Online (Sandbox Code Playgroud)
当我使用相同的正则表达式与模式而不是集合时,vim只能正确匹配2个或更多的空格:
\%(\s\)\{2,}
Run Code Online (Sandbox Code Playgroud)
我知道我不需要使用集合,但如果我在在线正则表达式解析器(例如Rubular)中尝试表达式,它也可以使用集合.
谁能解释为什么这些表达式不会以同样的方式评估?
因为\%[...]
和\%(...\)
完全不同的模式.
\%[...]
是指一系列可选原子.例如,r\%[ead]
匹配"read","rea","re"和"r".\%(...\)
将封闭的原子视为单个原子.例如,r\%(ead\)
匹配仅"读取".以便,
\%[\s]\{2,}
可以解释为\(\s\|\)\{2,}
,然后\(\s\|\)\(\s\|\)\|\(\s\|\)\(\s\|\)\(\s\|\)\|...
.这里\(\s\|\)\(\s\|\)
,最小图案,可以被解释为\(\)\(\)
,\(\)\(\s\)
,\(\s\)\(\)
或\(\s\)\(\s\)
.它也匹配1个空白字符.\%(\s\)\{2,}
可以解释为\s\{2,}
,然后\s\s\|\s\s\s\|...
.它只匹配2个或更多的空格字符.