2012-11-02 107 views
3

新的正則表達式,我需要在某些日期模式匹配來改變格式。用正則表達式替換Vim

那裏到2000

之前沒有條目我會從mm/dd/yyyyyy-mm-dd什麼我不熟悉是一羣怎樣的東西使用的\1\2,各自引用等

我想先匹配mm/dd/yy(\d{2}) (\/\d{2}) (\/\d{2})之類的東西嗎?還是像\d\d/\d\d/\d\d一樣簡單?

假設我的第一個分組是部分正確的想法,我希望做類似:

:%s/old/new/g 
:%s/ (\d{2}) (\/\d{2}) (\/\d{2})/(20+\3) - (\3) - (\1) /g 

編輯:對不起,取而代之的是去一個yyyy-mm-dd format連字符,而不是斜線。

回答

9

我打算評論另一個答案,但它變得複雜。

注意magic設置。如果你想要非轉義的parens進行分組,你需要在你的模式中包含\v。 (見:help magic)。

如果您在:s命令中使用了斜線以外的內容,則可以避免使用斜線。

你就近了。 :)你不需要所有這些空間,因爲他們需要空間在相同的地方匹配。

我的解決辦法,在這裏我用\v所以我不需要逃避括號和感嘆號,所以我可以用我的方式斜線沒有逃脫他們:

:%s!\v(\d{2})/(\d{2})/(\d{2})!20\3-\2-\1!g 

這將匹配「內部」項目即使以三位或更多位數開始或結束也是如此。如果你可以給出開始/結束標準,那麼這可能會有所幫助。假設簡單的「單詞邊界」的條件下工作,可以使用<>:(!學習)

:%s!\v<(\d{2})/(\d{2})/(\d{2})>!20\3-\2-\1!g 

要特別批評你:因爲想必你不

:%s/ (\d{2}) (\/\d{2}) (\/\d{2})/(20+\3) - (\3) - (\1) /g 
  • 擺脫空間不要他們!
  • 您的分組需要要麼\(\)\v工作
  • 您還需要\{2}除非你使用\v
  • 你把斜線在組二和三,這意味着他們將在更換出現過
  • 你不想在輸出中使用括號!
  • 您直接替換文本;你不想在輸出20之後輸入+
+0

+1爲「魔術」的解釋。多年來,我一直是一名vi/vim用戶,並且習慣於逃避一切。 – Gus

-1

的比賽:(\d{2})\/(\d{2})\/(\d{2})

對於替換:20\3\/\1\/\2

+0

這與匹配二進制文字的字面parens和大括號相匹配。 –

+0

什麼? http://rubular.com/r/LLK0Ycxo6D –

+0

Ruby不是Vim。 –

1

試試這個:你有興趣

:%s/\(\d\{2}\)\/\(\d\{2}\)\/\(\d\{2}\)/20\3-\2-\1/g 

該位是:\(...\) - 捕捉; \d - 一個數字; \{N} - 出現N次;和\/ - 一個文字正斜槓。

這就是捕獲兩位數字,跳過一個斜線,再捕獲兩個數字,跳過另一個斜線,再捕獲兩個數字,然後用「20」+第三個對聯代替+「 - 」+第二個對聯+「 - 」 +第一個對聯。這應該將「dd/mm/yy」變成「20yy-mm-dd」。

+0

更改了替換模式以反映對該問題的編輯。 –

1

沒關係,試試這個:

:0,$s#\(\d\{1,2\}\)/\(\d\{1,2\}\)/\(\d\{1,2\}\)#20\3-\2-\1#g 

我已經刪除了大量的空間,無論是在匹配部分和替換部分,和大多數括號的,因爲格式你問了沒沒有。

注意到有些事情:

  • vi,你可以改變「/」其他任何字符,當你試圖匹配在它斜線一個字符串,它可以幫助..我通常使用' #'但它不一定是。
  • 你必須逃避parens和花括號
  • 我使用:0,$而不是%s,但我認爲它有相同的含義 - 將下列命令應用於行之間的每一行0和結束。
+0

'0,$'是三個字符,當'%'表示同一個東西!儘管允許一位數, OP沒有說明數字是否爲零填充。 –