我正在编辑包含以下行的 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>
有人可以发现我做错了什么吗?
最佳答案
您需要转义 +
. 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
关于regex - "Pattern not found"在 Vim 中搜索 HTML 文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21396030/