
我有幾個文字文件,其內容類似於以下範例:
{
{
1,
text1,
text2,
}
}
{
{
52,
text1,
text2,
}
}
{
{
105,
text1,
text2,
}
}
我想知道如何批量搜索多個文件並按如下方式替換它們:
{
{
17001,
text1,
text2,
}
}
{
{
17052,
text1,
text2,
}
}
{
{
17105,
text1,
text2,
}
}
基本上我會在每個雙左括號後的第一個數字中添加 17,000。我嘗試使用 \d\d\d 將數字替換為 17\d\d\d 但隨後它會給我 17ddd 字母而不是數字。請協助
答案1
你有兩個問題:
- 在替換字串中
\d
意味著“打印 ad
”,僅此而已。所有正規表示式特殊的東西,如\d
and\w
等,僅適用於搜尋模式,不適用於替換字串。 - 正如@DavidPostill 所說,Notepad++ 無法在正規表示式搜尋/替換中進行數學運算。
您可以選擇三種方式來做您想做的事:
- 使用一些程式、腳本或外掛程式來為您進行替換。正如前面提到的評論所說,任何版本都是偏離主題的。
- 使用Notepad++搜尋取代3次。
- 第一輪為一位數,
- 第二輪兩位數,以及
- 第三輪三位數。
- 如果您的 Notepad++ 版本高於 v6.0,您可以在正規表示式中使用 PCRE 語法,並使用很好的答案透過 @ACR 一次完成這一切。
若要在三遍方法中完成此操作,請使用下列步驟。您可能必須修改搜尋模式以捕獲您想要的內容,並且僅捕獲您想要的內容。它們在您上面提供的範例中工作,但您的文件可能比範例更複雜。
第一回合
找到這個:
(\s+)(\d),
替換為:
\11700\2,
第二輪
找到這個:
(\s+)(\d\d),
替換為:
\1170\2,
第三輪
找到這個:
(\s+)(\d\d\d),
替換為:
\117\2,
它能做什麼
在該Find this
模式中\s+
尋找下一個標記之前可以找到的所有空格,至少需要一個來防止匹配除空格之外的任何數字之後的數字。它周圍的內容()
使其成為匹配返回的第一個捕獲的字串。匹配\d
一位數字,分組\d\d
並\d\d\d
使其完全匹配 2 或 3 位數字。再次()
將其變成捕獲組,這次是第二個。最後,,
匹配數字後面的逗號,使其保持在範例文件中的同一行。
在 中Replace with this
,\1
被第一個捕獲組(空格)取代。1700
、170
、 並17
列印需要新增到該行的部分。被第二個捕獲組替換\2
,它是查找模式中的數字。最後,逗號,
被明確替換,而不是為其浪費捕獲組。
答案2
您可以透過一次尋找和替換來完成此操作。 Notepad++ 可讓您根據群組是否匹配進行條件替換。
找什麼:
^(\s*)(\d{3})?(\d{2})?(\d{1})?(,\s*)$
用。
$1(?{2}17$2)(?{3}170$3)(?{4}1700$4)$5
Find-Expression 的解釋
從外向內依序進行:
- 和字元
^
分別$
標記行的開頭和結尾。 - 匹配
(\s*)
開頭的空格,(,\s*)
匹配逗號和行尾的任何尾隨空格。 - 在中間,我們有三個不同的組別來匹配 3、2 或 1 位數字(使用語法
{n}
)。每個組後面都跟有一個,?
將其標記為可能不匹配。群組的順序很重要,因為群組按照它們出現的順序進行配對。如果有三位數字,則第一組匹配,後面兩組兩匹配就沒有數字了。如果有兩個數字,則第一組將無法匹配,第二組將匹配,且第一組將沒有任何數字可匹配。
替換表達式的解釋
- and
$1
將$5
匹配行開頭的空格以及行末尾的逗號和空格。 - 以下組(以相反順序列出,根據查找表達式中匹配的組附加“17”加上正確的零數量。例如,採用第一個組
(?{2}17$2)
。?{2}
檢查組 2 是否匹配如果是,則插入以下文本:“ 17”加上組2 的匹配項,該匹配項應該是三位數。