[英]How can I have my Access VBA regex return all possible matches instead of only the first match?
[英]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.