2

昨天我试图替换( )我的文本中的所有内容,但没有替换之前搜索中的匹配项。我找不到好的解决方案。我是一一改变的。

这是我的原文

(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.

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

4

3 回答 3

3

您可以使用\@!负前瞻):

:%s/(\%(\a*\sJohnson\)\@!\([^)]*\))/[\1]/g
     ->|............|<---
  • \%(...\)\@!是一个Negative Lookahead
  • \([^)]*\)将匹配除).
  • \%(用来忽略一个捕获的组,否则你需要/[\2]/
于 2012-04-08T07:48:35.793 回答
2

这可以工作:

:%s/(\(\a*\sJohnson\))/LEFTPARENT\1RIGHTPARENT/g
:%s/(/[/g
:%s/)/]/g
:%s/LEFTPARENT/(/g
:%s/RIGHTPARENT/)/g
于 2012-04-08T07:22:10.450 回答
1

可以使用以下替换命令来实现所讨论的目的。

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

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

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

:%s/\(IGNORE\)\zs\|s/\=submatch(1)!=''?'':'t'/g
于 2012-04-08T13:01:04.217 回答