2010-06-04 71 views
7

我在follwing格式文本中的替換空間:VIM的正則表達式的報價

ERR_OUT_OF_MEM, "ERR OUT OF MEM" 
ERR_SOMETHING_BAD, "ERR SOMETHING BAD" 

我要替換文本中哪一個是用下劃線引號內的所有空間:

ERR_OUT_OF_MEM, "ERR_OUT_OF_MEM" 
ERR_SOMETHING_BAD, "ERR_SOMETHING_BAD" 

最好正則表達式我能想出是:

\("\w\+\)\@<= 

(有在這後面加上一個空格)

但這隻能在每個引用字符串中找到第一個空格,並且我需要多次重複以獲得所需的效果。

任何方式一次完成它?

謝謝!

回答

6

當然是有,在一個通工作的一個長度爲0的模式,但我從來沒有使用它們很成功,我更喜歡這樣的做法:

:%s/\%("[^"]*"\)*\("[^"]*"\)/\=substitute(submatch(1), ' ', '_', 'g')/g 

注:雙引號保持分組2×2,以不變換

foo bar "foo bar" "foo barr" 

foo bar "foo_bar"_"foo_barr" 

編輯:如風鈴草指出ö UT,以下是綽綽有餘:

%s/"[^"]*"/\=substitute(submatch(0), ' ', '_', 'g')/g 
+0

爲什麼不直接使用'/「[^」] *「/'格局我不明白什麼跳過最初的雙引號購買你(用'\%(「[^」] *「\)*') – rampion 2010-06-04 16:45:48

+0

好點。 我被說服了,搜索將不會在結束報價之後開始,而是在開盤之後。我糾正了正則表達式。謝謝。 – 2010-06-04 17:06:10

6

這不是一個通用的解決方案,因爲它會匹配該線路上的雙引號後出現在任何地方的任何空間,但應在字符串工作您指定的格式:

s/\v(\".*)@<= /_/g 

我用\ v(verymagic)令牌,因爲我認爲它使正則表達式有點更具可讀性,我包括整個替換命令,因爲「G」最後很重要。

對於那些跟在家裏的人,這個正則表達式首先用\ v來設置'verymagic'模式。然後它定義了令牌(\".*),它大致意味着「雙引號,然後是其他任何內容」,並使用向後註釋斷言@<=來說「只匹配最後一個標記之後的東西」 - 換句話說,只匹配雙引號後的某處。最後,還有一個空間,它實際上是匹配的,替換項是下劃線,這是我們想要替換它的地方,而g表示「替換所有匹配項」,所以我們不只是得到第一個找到匹配。

+0

這有效,但它也取代了我在行末的空格。 – 2010-06-07 04:45:36

+0

啊。是的,如果你有尾隨空格,你需要一個更復雜的方法。上面的Luc應該這樣做。 – 2010-06-07 14:07:03

0

我的PatternsOnText plugin提供了:SubstituteInSearch命令。有了它,你的帶引號的字符串第一次搜索,然後只在比賽進行:substitute

/".\{-}" 
:SubstituteInSearch/_/ /g