匹配另一个字符串的字符串

时间:2014-07-27 10:44:33

标签: vim match

在vim中,我试图匹配两个字符串(最多为空格)仅当时它们之间有另一个指定的字符串。

示例:假设某些函数调用

call someFunction(foo, bar)
call anotherFunction(foo)
call thirdFunction(foo, bar)

现在如果我们指定字符串foo,bar,我希望它看起来像这样(<>里面的东西应该匹配)

call <someFunction(>foo, bar<)>
call anotherFunction(foo)
call <thirdFunction(>foo, bar<)>

一个更简单的例子是匹配特定内容所包围的字符串。例如。在something foo, bar something (foo, bar)中只匹配第二次出现的foo,bar,而不是括号。从那以后,我可能会解决它。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

您可以使用lookaround来实现目标:

(\@<=[^()]*)\@=

可以改写为:

(\zs[^()]*\ze)

他们会匹配(...)内的文字。

答案 1 :(得分:-1)

首先,你不能在Vim中同时匹配多个东西。只有一个(连续)选择,一个文本对象等。可能的是使用正则表达式捕获多个子字符串,然后使用:substitute命令重新排列这些子字符串。这是适用于您的示例的一个:

:%s/\(\<\w\+\>(\)foo, bar\()\)/function is \1\2/

\(...\)捕获组,匹配的文本通过替换部分中的\1等插入。请阅读:help :substitute了解详情。