在Powershell -match中,$ Match是否可以重用?

时间:2019-03-07 01:26:05

标签: regex powershell replace pattern-matching match

我正在尝试从字符串中读取多个值。关键字可以出现在字符串中的任何位置。我想要“值”或紧随其后的内容。

$str = 'Some version v1.2.3.4 (xyz) AnotherVal RandomKeyword: ValX'

我尝试过

$test = $str -match 'Some version .*'
$val1 = $Matches[0] -replace 'Some version',''
Write-Host $val1 #gets the remainder of the string
$test2 = $val1 -match '\) '
Write-Host $Matches[0] #doesn't get the string following

是否有某种方法必须重置$Matches?也许有更好的模式匹配方法?

2 个答案:

答案 0 :(得分:3)

您似乎想要的是捕获组。如果是这样,那么这似乎可以解决问题。 [咧嘴]

$InStuff = 'Some version v1.2.3.4 (xyz) AnotherVal'

$InStuff -match '^.+ version (.+) \(.+\) (.+)$'

$Matches

输出...

Name                           Value
----                           -----
2                              AnotherVal
1                              v1.2.3.4
0                              Some version v1.2.3.4 (xyz) AnotherVal

您可以使用匹配的索引号访问不同的捕获组。如果知道信息的类型,则可以使用名为 的捕获组。

答案 1 :(得分:1)

在第一个示例中,您的正则表达式Some version从字符串的开头开始,而.*则将其结尾。 $matches包含整个字符串,因为正则表达式“ match”是整个字符串。

在第二个示例中,\)仅包含一个封闭的括号和一个空格。这就是正则表达式“匹配”,因此就是$matches中的内容。要获取其余部分,您需要更改正则表达式,使其也与其余部分匹配:$val1 -match '\) .*'

@Lee_Dailey的答案非常适合正确使用Regex,但方便通常是向后使用regex并摆脱掉您知道的东西,从而使未知数遗留掉。

$str = 'Some version v1.2.3.4 (xyz) AnotherVal'
$lastBit = $str -replace 'Some version '
$parts = $lastBit -split ' '