单个匹配
你可以使用 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)