Powershell

正則表達式排除具有 x 個 ’s 的行

  • March 22, 2017

我確信這已經被問過並解決了,但我被困在這個簡單的正則表達式上。我正在為正則表達式使用 powershell 和 .net。

假設我有一個包含以下行的文件: C:\share\my file.txt C:\share\folder1\anotherfile.txt C:\share\folder1\yetanotherfile.txt

什麼正則表達式將允許我只返回 C:\share\my file.txt 而忽略 C:\share\folder1… 我不知道如何告訴正則表達式忽略該行,如果它包含超過 2 個 ' s。

提前致謝。

我不知道正則表達式的 powershell 細節或逐行掃描文件,但假設 powershell 正則表達式與所有其他正則表達式一樣,與您的字元串匹配的實際模式看起來像這樣(下面的第三個正則表達式與您的範例匹配) :

  • ^[^\\]*(\\[^\\]*){3}$- 正好 3 個反斜杠,由任意數量(包括零)的非反斜杠分隔。請注意,由於反斜杠是大多數正則表達式實現中的特殊字元,因此您可能需要將其加倍,即使在內部$$ $$,因為它也可以在那裡使用,以匹配諸如[\s].
  • ^[^\\]*(\\[^\\]+){,2}$- 在 0 到 2 個反斜杠之間且不多,由 1 個或多個非反斜杠分隔,並在最後一個反斜杠之後與其他非反斜杠字元分隔。
  • ^[a-z]:\\share\\[^\\]+$- 我想這就是你要求的。將整個字元串(^ ... $) 匹配到後跟“share”後跟文件名的驅動器號,但在共享名之後沒有進一步的反斜杠。您必須添加/i不區分大小寫的匹配,或者 powershell 用來忽略大小寫的任何語法,我不知道,但Google會展示如何做到這一點。如果您肯定知道驅動器並希望將其修復,請替換[a-z]:為。c:替換\\share\\[^\\]+(\\[^\\]+){2}以允許任何共享名稱,但不能比頂層更深。替換share(this-share|that_share)以允許特定共享名稱的列表。

第二種模式是這樣工作的(第三種模式類似):

  • ^匹配字元串的開頭(如果我們不測試整個字元串,它可能會匹配帶有 2 個反斜杠的部分並且不檢查其餘部分是否沒有更多的反斜杠)
  • [^\\]*匹配任意數量 (0+) 個非反斜杠
  • (\\[^\\]+){,2}重複匹配一個組,其中該組包含反斜杠,後跟任意數量 >0 的非反斜杠,該組最多可以重複 2 次(但不能更多)。用於{2}恰好 2 個匹配項,或{1,2}1 到 2 個包含匹配項
  • $匹配字元串結尾 - 在反斜杠和非反斜杠的重複匹配後,不應出現任何其他內容(因為最後一位將是您共享中的文件名)

運氣好的話,你可以從這些中解決。很難說更多或給出一個明確的答案,因為有些模式你沒有說它應該做什麼。例如,有時可能會出現尾部反斜杠,因為如果輸入恰好是文件夾,這是有效且可選的,並且可能導致正則表達式對某些文件夾的錯誤評估。同樣適用於 UNC 共享,例如 \?\D:\share\myfile.txt 或 \server\share\myfile.txt,同樣適用於只有一個斜杠 (c:\myfile.text) 的路徑。非法字元同上(文件是否包含任何不是有效文件名的內容,例如分號,或者如果可能發生,您會單獨測試嗎?)。

如果您更準確地闡明正則表達式應該做什麼,或者如果您需要解釋這些工作原理,我將更新此答案並添加正則表達式或更多詳細資訊。

引用自:https://serverfault.com/questions/839036