[英]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 format
為yyyy-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}
+
嘗試這個:
:%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
我在匹配部分和替換部分以及大部分括號中都刪除了很多空格,因為您要的格式沒有它。
注意事項:
對於匹配: (\\d{2})\\/(\\d{2})\\/(\\d{2})
對於替換: 20\\3\\/\\1\\/\\2
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.