我正在尝试从字符串中读取多个值。关键字可以出现在字符串中的任何位置。我想要“值”或紧随其后的内容。
$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
?也许有更好的模式匹配方法?
答案 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 ' '