簡體   English   中英

如何獲取我的regex方法以返回所有路徑匹配項?

[英]How can I get my regex method to return all path matches?

我正在嘗試從使用的backup命令中解析出我們的備份路徑,即網絡共享。

備份命令如下所示:

BACKUP DATABASE [UnitTestDB] TO DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak' WITH CHECKSUM, COMPRESSION

我想要的是讓所有網絡共享。

\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak

沒有單引號,只有值。

我可以在http://regexstorm.net/tester上使用它,但似乎無法將其轉換回PowerShell術語。 這是在測試器中起作用的匹配表達式。

[DISK = N'](\S*)[']

但是PowerShell僅返回四個匹配項中的一個,它也返回N' 這一定是我沒有發現的語法錯誤。

輸出:

Groups   : { N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak', 
           N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak}
Success  : True
Captures : { N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak'}
Index    : 38
Length   : 100
Value    :  N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak'

這是我到目前為止的代碼...

$backupCommand = "BACKUP DATABASE [UnitTestDB] TO DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak' WITH CHECKSUM, COMPRESSION"

[regex]::Match($backupCommand,"[DISK = N'](\S*)[']")

使用[regex]::Matches而不是Match來獲取多個匹配項 要獲取捕獲組,您必須訪問屬性Groups[1].Value 另外,您的正則表達式是錯誤的,您必須省略方括號:

$backupCommand = "BACKUP DATABASE [UnitTestDB] TO DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak', DISK = N'\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak' WITH CHECKSUM, COMPRESSION"

[regex]::Matches($backupCommand,"DISK = N'(\S*)[']") | Foreach {
    $_.Groups[1].Value
}

輸出:

\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_1.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_2.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_3.bak
\\networkshare\sqldb\servername\UnitTestDB\FULL\servername_UnitTestDB_FULL_20160614_231500_4.bak

這將起作用,但是由於如果網絡路徑中包含空格,捕獲組將失敗,因此我將更改正則表達式以捕獲所有字符,直到結尾的'

DISK = N'([^']+)

正則表達式可視化

正則表達式解決方案有很多選擇。 馬丁的答案解釋了為什么您沒有獲得預期的結果,並且需要使用靜態方法[regex]::Matches返回所有結果。 您還可以將Select-String-AllMatches開關一起使用以執行相同的操作。 由於它返回matchinfo對象,因此您還需要進行一些后期處理。

我根據您的源數據使用了不同的正則表達式。 返回雙引號之間的匹配項。 如果我使用先行和后退,本來可以使它更簡潔,但是我想使正則表達式保持簡單。

$regex = "'(.*?)'"

($data | Select-String -Pattern $regex -AllMatches).Matches | 
    ForEach-Object{$_.Groups[1].Value}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM