单个匹配

你可以使用 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)