單個匹配

你可以使用 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'。這將返回 truefalse,具體取決於搜尋結果。如果匹配,你可以通過訪問 $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)