簡體   English   中英

用正則表達式替換Vim

[英]Vim substitution with regex

regex的新功能,我需要在某些日期進行模式匹配以更改格式。

我要從mm/dd/yy轉到yyyy-mm-dd ,在2000年之前沒有條目。

我不熟悉的是如何將事物分組以使用它們各自對\\1\\2等的引用。

我首先要在mm/dd/yy上匹配( \\d{2} ) ( \\/\\d{2} ) ( \\/\\d{2} )還是像\\d\\d/\\d\\d/\\d\\d一樣簡單\\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 formatyyyy-mm-dd format

我打算對另一個答案發表評論,但這變得很復雜。

注意magic設置。 如果要讓未轉義的括號進行分組,則需要在模式中的某個位置包含\\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才能工作
  • 除非您使用\\v否則還需要\\{2}
  • 您將斜線放在第二和第三組中,這意味着它們也將出現在替換中
  • 您不希望在輸出中加上括號!
  • 您是直接替換文字; 您不希望輸出中20之后的+

嘗試這個:

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

您感興趣的位是: \\(...\\) -捕獲; \\d一個數字; \\{N} -N次出現; \\/ -文字正斜杠。

因此,這是捕獲兩個數字,跳過一個斜杠,再捕獲兩個數字,跳過另一個斜杠,再捕獲兩個數字,然后將其替換為“ 20” +第三個對聯+“-” +第二個對聯+“-” +第一個對聯。 那應該把“ dd / mm / yy”變成“ 20yy-mm-dd”。

好的,試試這個:

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

我在匹配部分和替換部分以及大部分括號中都刪除了很多空格,因為您要的格式沒有它。

注意事項:

  • 使用vi可以將'/'更改為其他任何字符,這在嘗試匹配帶有斜杠的字符串時會有所幫助。.我通常使用'#',但不一定如此。
  • 您必須避開括號和花括號
  • 我使用:0,$代替%s,但我認為它的含義相同-將以下命令應用於行0和末尾之間的每一行。

對於匹配: (\\d{2})\\/(\\d{2})\\/(\\d{2})

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM