編輯 我意識到我在解釋自己時犯了一個錯誤。對此表示歉意。
大多數工件都來自此路徑:
D:\Folder1\Folder2\Folder3\Folder4\Folder5\
然后像這樣進入 Artifact 檔案夾及其子檔案夾:
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.0\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.1\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.2\data.xxx
我將不勝感激以下事情的幫助:
我有這個不同工件的路徑串列(大約 5k 行),它們有不同的版本,給你一個例子:
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.0\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.1\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.2\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder2\Artifact\Artifact-1.1\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder2\Artifact\Artifact-1.2\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder2\Artifact\Artifact-1.3\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder3\Artifact\Artifact-1.2\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder3\Artifact\Artifact-1.3\data.xxx
我要實作的目標是:
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.0\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder2\Artifact\Artifact-1.1\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder3\Artifact\Artifact-1.2\data.xxx
基本上將其范圍縮小到只有 1 個版本。
我試過使用^(.*)(\n\1) $,$1.但這顯然沒有用。所以我想知道你是否知道如何解決這個問題。非常感謝幫助,謝謝!
uj5u.com熱心網友回復:
您可以使用
Find what: ^(.*\.)(\d )\\[^\\\n] (\n\1\d \\[^\\\n] ) $
Replace: $1$2\\
請參閱正則運算式演示。詳情:
^- 行首(這是^Visual Studio Code 中的默認行為)(.*\.)- 第 1 組:除換行符之外的任何一個或多個字符,盡可能多,然后是.(\d )- 第 2 組:\\- 一個\字符[^\\\n]\- 除了和換行符之外的一個或多個字符(\n\1\d \\[^\\\n] )- 第 3 組捕獲一個或多個換行符序列,然后將值捕獲到第 1 組中,一個或多個數字,一個\字符,然后是一個或多個除\換行符以外的字符$- 行尾。
uj5u.com熱心網友回復:
這是另一個嘗試,請參見regex101 demo。
someText-\d?.基本思想是在捕獲組 2中隔離。
然后$2在以下幾行中查找。以下幾行之前$2或之后的內容可能會有所不同。$2
查找:^(.*\\(?=.*\\))(.*-\d \.)(.*\\?.*)(\n.*\2.*)*
替換:$1$2$3
所以這是最有趣的部分:^(.*\\(?=.*\\))(.*-\d \.)
這將使您的Artifact-1.or Artifact-17.orsomeText-2.進入捕獲組 2。因為使用正向前瞻(?=.*\\),以下組 2(.*-\d \.)將僅位于最后一個目錄中。然后(.*\\?.*)將該線的其余部分收集到第 3 組。
最后(\n.*\2.*)*檢查以下行中是否存在對組 2 的反向參考\2。[從技術上講,該反向參考可以在一行中的任何位置,甚至是開頭,如有必要,可以修復 - 如果您的資料需要它,請告訴我。如果是“someText-/d”,請參閱更安全的 regex101 演示。可能出現在任何地方,如果不是最后一個目錄,則應被忽略并使用該查找。]
uj5u.com熱心網友回復:
您不能使用 對整行使用單個捕獲組^(.*),因為您只想使用反向參考重復最后一個點之前的部分,這將無法捕獲整行。
因此,您必須在單獨的捕獲組中捕獲第一個匹配中的數字,以將其保留在替換中。
如果要在最后一個點之前使用相同的文本匹配以下所有行,可以使用重復組:
^\s*(.*\.)(\d \\[^\\\r\n]*)(?:\r?\n\s*\1\d*\\[^\\\r\n]*)
模式匹配:
^字串的開始\s*匹配可選的空白字符(.*\.)捕獲組 1,匹配到最后一個點(\d \\[^\\\r\n]*)捕獲組 2,匹配 1 個數字,以及除換行符\之外的可選字符\(?:非捕獲組\r?\n\s*\1將換行符和反向參考匹配到組 1\d \\[^\\\r\n]*與第一部分相同的模式
)關閉非捕獲組并重復1 次
查看正則運算式演示。
在替換中使用 2 個捕獲組$1$2
替換看起來像
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder\Artifact\Artifact-1.0\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder2\Artifact\Artifact-1.1\data.xxx
D:\Folder1\Folder2\Folder3\Folder4\Folder5\ArtifactFolder3\Artifact\Artifact-1.2\data.xxx
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/454591.html
