vim正则表达式:负面反向引用?

时间:2014-05-14 16:30:40

标签: regex vim

我试图匹配链接与链接文本不对应的XML条目,如下所示:

<link linkend="G431">X595</link> 

但不是链接文本正确的链接,如下所示:

<link linkend="G431">G431</link> 

如何编写vim正则表达式以匹配其中的第一个?我尝试过这样的事情:

linkend="\([A-Z]\d\+\)">[^\1]

linkend="\([A-Z]\d\+\)">^\(\1\)\@!

但我似乎无法开始工作。基本上我试图说&#34;找到链接文本不等于链接位置的链接。&#34;

3 个答案:

答案 0 :(得分:4)

在您的第二个版本中,您有…\)">^\(\1\)\@!…。你在这里不需要插入:它意味着自己(插入符号)处于这个位置(通常它意味着“行首”,但不是那里:见:h /^)。你不需要括号(它们没有伤害,但不需要它们):

linkend="\([A-Z]\d\+\)">\1\@!

。否定通过!表示(正面预测为\@=)。在[^\1]变体中,您匹配任何字符,但反斜杠,ASCII和换行符:集合不支持反向引用,即使它们支持它,集合匹配多个字符也是不合逻辑的(如果他们这样做会拉出匹配文本中出现的一组字符。)

答案 1 :(得分:1)

你的方法非常接近正确。

我刚刚使用了负向前瞻:

linkend="\([A-Z]\d\+\)">\(\1\)\@!

答案 2 :(得分:0)

/<link linkend="\(.*\)">\(\1\)<\/link>