2012-04-08 30 views
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. 

编辑
有一种简单的方法来代替在比赛中的一个或多个的任何字符在文本而不是这些?

+0

我已经编辑你的问题。这是你的意思吗? – kev 2012-04-08 08:06:54

+0

你做得很好。是的,这就是我的意思。我希望找到一种(一般)方式,以便我能够更快地做到这一点。 – Reman 2012-04-08 08:42:17

回答

1

我们可以使用下面的替换命令来达到目的的 问题。

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

其中IGNORE指定不括号匹配 是改变(\a*\sJohnson,例如)的图案。

为了解决缓冲 处处代替除了IGNORE图案匹配的一个普遍的问题,可以使用命令

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

ib,如果'\ a * \ sJohnson'是我的搜索,我想用文本中的所有字符替换空格sauf'\ a * \ sJohnson'或者我想将文本中的所有's'改为't'在比赛中找到's',那么正则表达式是什么? – Reman 2012-04-08 13:10:49

+0

@Remonn:看看更新后的答案。如果我添加的命令解决了问题(我不确定我是否正确),我将详细说明这个描述。 – 2012-04-09 02:12:07

+0

ib,谢谢。我试过你的代码没有成功。填写页码3行与字符'a'并且把'try'放在行内(忽略文本)并且尝试用'b'替换所有'r'。我无法让它工作。也许我做错了什么。 – Reman 2012-04-09 12:48:44

2

这可以工作:

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

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

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

不错,就像我所做的那样,这会容易得多,但是你会怎样做p.e.在文本中替代所有的“s”,但不是在比赛中找到的那个? – Reman 2012-04-08 07:59:05

相关问题