2016-02-09 31 views
2

我使用PowerShell來查詢從結果應該像下的服務路徑的文件擴展名後刪除字符串exe文件擴展名,例如輸出可能類似於以下之一:正則表達式

  • C:\目錄\子目錄\ service.exe ThisTextNeedsRemoving
  • C:\目錄\子目錄\ service.exe - ThisTextNeedsRemoving
  • C:\ directory \ sub-dir ectory \ service.exe/ThisTextNeedsRemoving

即ThisTextNeedsRemoving可能會進行空格,連字符或正斜槓。

我可以使用regex -replace'($ *。exe)。*'刪除之後的所有內容,但包括.exe文件擴展名,但是如何將.exe保留在結果中?

+1

'($ *。exe文件)。*'不匹配沒有'(M)'修改任何東西。我想你需要'^(\ S +)。*'(或'^(\ S + \。exe)。*')並用'$ 1'代替。 –

+0

如果輸入'$ s',請嘗試'$ s -replace'^(\ S + \。exe)。*','$ 1''。 –

+0

不要在實際生產中使用lookbehind,請在捕獲和反向引用中使用我的方法。在性能方面,後視是最糟糕的。雖然在這種情況下並不重要,但習慣最佳實踐是一個好主意。 –

回答

3

可以使用環視:

$txt = 'C:\directory\sub-directory\service.exe /ThisTextNeedsRemoving' 

$txt -replace '(?<=\.exe).+', '' 

本採用查找它的後面是一個零寬度匹配,因此不會被替換。

Regular expression visualization

Debuggex Demo

2

使用回顧後是可能的,但要注意,lookbehinds只有在必要的時候,你需要指定一些相當複雜的條件或獲得重疊的匹配。在大多數情況下,當你可以做到不存在逆序時,你應該考慮使用非隱藏的解決方案,因爲這是一個相當昂貴的操作。如果當前字符不是空格,而是檢查這些符號中的每一個是否都以其他字符開頭,則更容易檢查一次。或者是一個完整的子字符串,或者一個更完整的模式。

因此,我建議使用基於捕捉機構,與替換部分反向引用的溶液,以恢復該結果所捕獲的字符串:

$s -replace '^(\S+\.exe) .*','$1' 

或 - 用於容納空間,而不是內部路徑雙引號:

$s -replace '^(.*?\.exe) .*','$1' 

說明

  • ^ - 串
  • 的開始
  • (\S+\.exe) - 比空白(\S+)之外的一個或多個字符(或多於一個換行,任何量的其它任何字符,儘可能少,與.*?),接着用文字.exe
  • .* - 一個空格,然後是除換行符以外的任意數量的字符。

enter image description here

+0

我只建議不要在這裏使用'\ S',因爲路徑名可以包含空格(即使海報的示例路徑沒有)。 '。+'在這裏最容易理解,或者是帶有所有無效Windows路徑字符的反轉字符類,它們可以通過'[System.IO.Path] :: InvalidPathChars -join'''方便地獲得。 – briantist

+0

包含空格的路徑通常用雙引號引起來,它會更容易:['^「([^」] * \。exe)*「。*'](https://regex101.com/r/gZ9kI8/3)。捕獲組的位置可以調整。兩種格式的正則表達式:['^(?:「([^」] * \。exe)*「|(\ S +))。*'](https ://regex101.com/r/gZ9kI8/2)。 –