1

我想使用多个分支进行搜索,并从匹配分支中获取子匹配项以用于替换。

对于这个特定问题,我想抓取完全由 '=' 或 '-' (较小的子集)中的一个字符组成的任何行,其中至少包含 3 个该字符,每个字符的空格条件不同。

所以我使用下面的表达式来匹配它们:

^\t\(=\)\{3,}\_$\|[ ]\{5,}^\(-\)\{3,}\_$

我接下来想做的是在替换中使用子匹配。我以为我可以这样做:

:.s/^\t\(=\)\{3,}\_$\|[ ]\{5,}^\(-\)\{3,}\_$/apple\1banana/e

但它似乎只在第一个分支(带有'=')匹配时才有效,而不是第二个分支。我怎样才能使这项工作?我正在寻找一种解决方案,它可以让我使用 20 个分支并且仍然能够从匹配的分支中获取子匹配。

4

2 回答 2

2

据我所知,您不需要组。这似乎与您的命令相同(我没有要测试的样本):

:.s/^\t\zs=\ze=\{2,}$\|^[ ]\{5,}\zs-\ze-\{2,}$/apple&banana/e

这会将所有 [-=] 放入替换中:

:.s/^\t\zs=\{3,}$\|^[ ]\{5,}\zs-\{3,}$/apple&banana/e

如果您可以分享您需要编辑的文本样本和预期结果,它将更容易测试我所写的内容是否有效。

于 2012-05-23T21:57:16.243 回答
1

您可以使用零宽度模式和反向引用来做到这一点:

\(\%(^\t\)\@<==\{3}\|\%([ ]\{5,}^\)\@<=-\{3}\)\_$

零宽度模式可让您将模式从匹配某些字符转换为匹配位置。 \@<=只是说前面的模式发生在当前位置之前。

\zs\%(...\)\@<=是一种特殊情况,可让您简化任何以to开头的模式...\zs

另一种方法是简单地使用替换中的所有反向引用 - 来自不匹配分支的那些将扩展为空字符串:

:.s/^\t\(=\)\{3,}\_$\|[ ]\{5,}^\(-\)\{3,}\_$/apple\1\2banana/e
于 2012-05-23T22:03:10.093 回答