替换某些字符,但不能替换匹配中找到的字符

时间:2012-04-08 07:11:22

标签: search vim pattern-matching

昨天我尝试在我的文字中替换所有( ),而不是在之前搜索的匹配中找到的(Peter Jackson) is the man who..... (John Johnson) is the man who.... and (John Johnson) is also the man who.. not as (Jon Johnson) more (letters) etc. /(\a*\sJohnson)。我找不到一个好的解决方案。我一个接一个地改变了。

这是我原来的文字

(

我的搜索模式: )
如何将文本中的所有[ ]字符替换为[Peter Jackson] is the man who..... (John Johnson) is the man who.... and (John Johnson) is also the man who.. not as (Jon Johnson) more [letters] etc. {{1}},而不是匹配中找到的字符?

结果应为:

{{1}}

修改
是否有一种简单的方法可以替换文本中的一个或多个字符而不是匹配中的这些字符?

3 个答案:

答案 0 :(得分:3)

您可以使用\@!Negative Lookahead):

:%s/(\%(\a*\sJohnson\)\@!\([^)]*\))/[\1]/g
     ->|............|<---
  • \%(...\)\@!Negative Lookahead
  • \([^)]*\)将匹配除)以外的所有内容。
  • 我使用\%(忽略已捕获的群组,否则您需要/[\2]/

答案 1 :(得分:2)

这可行:

:%s/(\(\a*\sJohnson\))/LEFTPARENT\1RIGHTPARENT/g
:%s/(/[/g
:%s/)/]/g
:%s/LEFTPARENT/(/g
:%s/RIGHTPARENT/)/g

答案 2 :(得分:1)

可以使用以下替换命令来实现此目的 问题

:%s/(\(.\{-}\%(IGNORE.\{-}\)\@<!\))/[\1]/g

其中IGNORE指定括号中不匹配的模式 要改变(例如\a*\sJohnson)。

为了解决在缓冲区中到处替换的一般问题 除了IGNORE模式的匹配之外,可以使用命令

:%s/\(IGNORE\)\zs\|s/\=submatch(1)!=''?'':'t'/g