單個匹配
你可以使用 Regex 快速確定文字是否包含特定模式。在 PowerShell 中使用 Regex 有多種方法。
#Sample text
$text = @"
This is (a) sample
text, this is
a (sample text)
"@
#Sample pattern: Content wrapped in ()
$pattern = '\(.*?\)'
使用 -Match 運算子
要使用內建的 -matches
運算子確定字串是否與模式匹配,請使用語法'input' -match 'pattern'
。這將返回 true
或 false
,具體取決於搜尋結果。如果匹配,你可以通過訪問 $Matches
變數來檢視匹配和組(如果在模式中定義)。
> $text -match $pattern
True
> $Matches
Name Value
---- -----
0 (a)
你還可以使用 -match
來過濾字串陣列,並僅返回包含匹配項的字串。
> $textarray = @"
This is (a) sample
text, this is
a (sample text)
"@ -split "`n"
> $textarray -match $pattern
This is (a) sample
a (sample text)
Version >= 2.0
使用 Select-String
PowerShell 2.0 引入了一個新的 cmdlet,用於使用正規表示式搜尋文字。它返回每個包含匹配的 textinput 的 MatchInfo
物件。你可以訪問它的屬性以查詢匹配的組等。
> $m = Select-String -InputObject $text -Pattern $pattern
> $m
This is (a) sample
text, this is
a (sample text)
> $m | Format-List *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
text, this is
a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
與 -match
一樣,Select-String
也可用於通過將陣列連線到字串來過濾字串陣列。它為每個字串建立一個包含匹配項的 MatchInfo
物件。
> $textarray | Select-String -Pattern $pattern
This is (a) sample
a (sample text)
#You can also access the matches, groups etc.
> $textarray | Select-String -Pattern $pattern | fl *
IgnoreCase : True
LineNumber : 1
Line : This is (a) sample
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(a)}
IgnoreCase : True
LineNumber : 3
Line : a (sample text)
Filename : InputStream
Path : InputStream
Pattern : \(.*?\)
Context :
Matches : {(sample text)}
Select-String
還可以通過新增 -SimpleMatch
開關使用普通文字模式(無正規表示式)進行搜尋。
使用[RegEx] :: Match()
你還可以使用 .NET [RegEx]
-class 中提供的靜態 Match()
方法。
> [regex]::Match($text,$pattern)
Groups : {(a)}
Success : True
Captures : {(a)}
Index : 8
Length : 3
Value : (a)
> [regex]::Match($text,$pattern) | Select-Object -ExpandProperty Value
(a)