如果char跟随后引用,则对后端引用的Vim正则表达式会失败

时间:2015-02-19 21:16:23

标签: regex vim

我正在学习Vim风格的正则表达式,并想了解为什么这不起作用。

假设我想在标记之后捕获所有内容,包括结束标记:

<div>Test div</div>More words
     ^^^^^^^^^^^^^^

这项工作有效,但不会留下尾随的>

/\v%(\<(\w+)\>)@<=.*\<\/\1

所以我希望这可以工作,但它什么都没有捕获:

/\v%(\<(\w+)\>)@<=.*\<\/\1\>

我知道还有其他方法可以捕捉到这一点,但我只是想知道为什么我不能在\1反向引用后包含一个字符。

为了方便和理解,这里是我对正则表达式的理解:

/\v  %(           # non-capturing
         \<       # <
         (        # captures group 1
            \w+   # 1+ alpha-numeric chars
         )
         \>       # >
      )@<=        # the match should be preceded by all of the above
     .*           # anything
     \<\/         # </
     \1           # that which was captured as group 1
     \>           # >

1 个答案:

答案 0 :(得分:2)

是的,这看起来像是基于NFA的新正则表达式引擎中的一个错误。当切换到旧引擎时,你必须交换捕获组并使用(所有在:help /\@<=下解释),但是,匹配工作:

\%#=1\v%(\1)@<=.*\<\/(\w+)\>

也正因为如此,:help与@PeterRincker一致认为使用\zs更好:

\v%(\<(\w+)\>)\zs.*\<\/\1\>

请报告此错误,请参阅:help bugs。基本上,您可以通过电子邮件将信息发送到vim_dev mailing list,或者也可以bug tracker发送信息。