Find-Expression 的解釋

Find-Expression 的解釋

我有幾個文字文件,其內容類似於以下範例:

{
    {
        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

你有兩個問題:

  1. 在替換字串中\d意味著“打印 a d”,僅此而已。所有正規表示式特殊的東西,如\dand\w等,僅適用於搜尋模式,不適用於替換字串。
  2. 正如@DavidPostill 所說,Notepad++ 無法在正規表示式搜尋/替換中進行數學運算。

您可以選擇三種方式來做您想做的事:

  1. 使用一些程式、腳本或外掛程式來為您進行替換。正如前面提到的評論所說,任何版本都是偏離主題的。
  2. 使用Notepad++搜尋取代3次。
    • 第一輪為一位數,
    • 第二輪兩位數,以及
    • 第三輪三位數。
  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被第一個捕獲組(空格)取代。1700170、 並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 的匹配項,該匹配項應該是三位數。

相關內容