我正在学习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
\> # >
答案 0 :(得分:2)
是的,这看起来像是基于NFA的新正则表达式引擎中的一个错误。当切换到旧引擎时,你必须交换捕获组并使用(所有在:help /\@<=
下解释),但是,匹配工作:
\%#=1\v%(\1)@<=.*\<\/(\w+)\>
也正因为如此,:help
与@PeterRincker一致认为使用\zs
更好:
\v%(\<(\w+)\>)\zs.*\<\/\1\>
请报告此错误,请参阅:help bugs
。基本上,您可以通过电子邮件将信息发送到vim_dev mailing list,或者也可以bug tracker发送信息。