我很擅長正規表達式,但有一件事我似乎無法弄清楚它是如何運作的。
如何在 NotePad++ 中進行搜尋/取代並確保輸出具有固定長度,而輸入可以靈活?
例如,對此執行正規表示式:23-6-2016
變為:23-06-2016
(06 額外 0,但如果是 12 則不額外)
另一種選擇是創建它:
TestString
並Test
會變成
TestString______________________
(額外的空格。)
Test____________________________
(額外的空格。)
當然,這裡的想法是進行批量搜尋/替換,其中輸出都具有相同的長度。
請解釋一下背後的想法。
編輯:為了了解我正在使用的數據,這是我需要處理的範例行:
12345678 TXT 19700101 0 100 20160624 100 Comment text
12345678 TXT 19700101 100 100,25 20160624 0,25 Comment text
12345678 TXT 19700101 100,25 100,5 20160624 0,25 Comment text
請注意,它們是用製表符分隔的。第一行中的第一個 0 應格式化為 0,00,100 應格式化為 100,00,但 12345678 和日期不應格式化為 ,00 最後 100,5 應格式化為 100,50
我已經解決了約會的問題,所以現在這不那麼重要了。
答案1
回應:
12345678 TXT 19700101 0 100 20160624 100 評論文本 12345678 TXT 19700101 100 100,25 20160624 0,25 評論文本 12345678 TXT 19700101 100,25 100,5 20160624 0,25 評論文本
對於第四列:
^((?:\S+\s+){3}\d+)(\s)
到\1,0\2
^((?:\S+\s+){3}\d+,\d)(\s)
到\10\2
對於第5/7列:
與上方類似,只需在規則中分別替換{3}
為{4}
/{6}
這第一條規則附加,0
到不帶 . 的數字,
。現在所有數字都必須有,\d
.
這第二條規則將 a 附加0
到逗號後的單一數字後面。
至於(?:)
:非捕獲組,前面的列已經被捕獲,\1
因此不需要額外的捕獲。
這只會將數字填入小數點後兩位。若要填入任意數量,請使用該pad excessively, then trim
方法。
最後一句?
在我看來,notepad++ 中的普通正規表示式不足以完成此任務。一些基本的腳本(例如 bash 或 perl)可以以更高的可讀性處理這個問題。
答案2
A 部分:墊至特定長度
若要使用正規表示式右邊填入包含 N 個字元的行,請在行末尾新增 N 個空格,然後將前 N 個字元分組以取代其餘字元。
第 1 遍:新增填充字符
尋找:$
取代:______________________________
在行尾增加 30 個空格。 (我使用下劃線,因為空格不會在帖子上格式化)。
第 2 遍:修剪剩餘 30 個字符
若要在行首填入短劃線分隔的日期,請相應地匹配每個部分。
尋找:^([[:print:]]{0,30}).*$
替換為\1
在行的開頭,將一組最多 30 個可列印字元替換為該組,後面跟著任何剩餘字元。
若要選擇不同的線長度,請在第 1 遍中使用 n 空格,然後將 30 替換為第 2 遍中的長度。
B 部分:以日期開頭的行
第 1 次(每月的某一天):
尋找內容:^([0-9])-
已取代為:0\1-
將模式(以單一數字開頭,後面跟著破折號的行)替換為填滿的零、數字和破折號。
通過2(月):
尋找內容:-([0-9])-
已取代為:-0\1-
將模式(兩個破折號之間的單一數字)替換為破折號、填滿的零、數字和破折號。