2012-04-08 51 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

相關問題