集合或模式中的不同正则表达式评估

Ber*_*nnF 1 regex vim

在vim中搜索正则表达式时,我遇到了一种奇怪的行为:

我试图清理文件中多余的空格,并希望使用substitute命令.

当我对集合使用以下正则表达式时,vim也匹配单个空格:

\%[\s]\{2,}
Run Code Online (Sandbox Code Playgroud)

当我使用相同的正则表达式与模式而不是集合时,vim只能正确匹配2个或更多的空格:

\%(\s\)\{2,}
Run Code Online (Sandbox Code Playgroud)

我知道我不需要使用集合,但如果我在在线正则表达式解析器(例如Rubular)中尝试表达式,它也可以使用集合.

谁能解释为什么这些表达式不会以同样的方式评估?

Kan*_*uno 6

因为\%[...]\%(...\)完全不同的模式.

  • \%[...]是指一系列可选原子.例如,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个或更多的空格字符.