在Vim搜索HTML文本时“找不到模式”

时间:2014-01-28 03:00:51

标签: regex vim

我正在编辑包含以下行的HTML文档:

<h2>Table of Contents</h2>

和许多其他类似的线路。我的光标当前位于此行的开头。命令

:%s!<h2>(.+)</h2>!<h2><a name="#link">$1</a></h2>!g

引发

E486: Pattern not found: <h2>(.+)</h2>

如果我试图逃避捕获组的括号,或者甚至完全省略它们,结果是相似的:

:%s!<h2>\(.+\)</h2>!<h2><a name="#link">$1</a></h2>!g
E486: Pattern not found: <h2>\(.+\)</h2>
:%s!<h2>.+</h2>!<h2><a name="#link">$1</a></h2>!g
E486: Pattern not found: <h2>.+</h2>

有人能发现我做错了吗?

1 个答案:

答案 0 :(得分:4)

你需要逃避+。 Vim中的一个或多个量词是\+,您正在搜索文字+。后面的引用也是\而不是$所以你的替换字符串应该是:

:%s!<h2>\(.\+\)</h2>!<h2><a name="#link">\1</a></h2>!g

如果您在一行上有多个<h2>标记,则此替换将是错误的。它将从第一个<h2>的开头到最后一个</h2>的结尾匹配。

要解决这个问题,你需要使用一个非贪婪的匹配,它将匹配尽可能少的字符而不是尽可能多的字符:

:%s!<h2>\(.\{-}\)</h2>!<h2><a name="#link">\1</a></h2>!g