我对如何在下面的字符串中获得数字感到困惑。我制作了一个正则表达式
$regex = '(?s)^.+bTotal Members in Group: ([d.]+).*$'
我只需要数字部分2
在一个长字符串中,一行读取Total Members in Group: 2
。
我的$regex
返回给我整行,但我真正需要的是数字。
数字是随机的
cls
$string = 'Total Members in Group: 2'
$membersCount = $string -replace "D*"
$membersCount
cls
$string = 'Total Members in Group: 2'
$membersCount = [Regex]::Match($string, "(?<=Group:s*)d+").Value
$membersCount
Fors1k的有用答案显示了绕过需要捕获组((...)
)的优雅解决方案-它们是问题中特定的示例的最佳解决方案。.
回答一般性问题至于如何提取子字符串如果和当需要捕获组, powershell惯用的方法是:
-
使用
-match
,具有单个输入字符串的正则表达式匹配操作符:如果-match
操作返回$true
,则自动$Matches
变量反映正则表达式捕获的内容,属性(键)0
包含完整匹配,1
包含第一个捕获组的匹配,等等。$string = 'Total Members in Group: 2' if ($string -match '(?s)^.*bTotal Members in Group: (d+).*$') { # Output the first capture group's match $Matches.1 }
- 注意:
-match
只在输入中查找一个匹配。需要直接使用底层的。net api来查找所有匹配,通过
[regex]::Matches()
-参见这个答案作为一个例子。虽然
-match
只使用单个输入字符串填充$Matches
(使用数组,它充当过滤器并返回匹配输入字符串的子数组),您可以使用switch
语句与-Regex
一起将-match
行为应用于输入字符串的数组;下面是一个简化的示例(输出'1', '2', '3'
):switch -Regex ('A1', 'A2', 'A3') { 'A(.)' { $Matches.1 } }
- 注意:
-
或者:使用
-replace
基于正则表达式的字符串替换操作符,用于匹配整个输入字符串,并将其替换为对捕获组感兴趣的捕获内容的引用;例如,$1
指的是第一个捕获组的值。$string = 'Total Members in Group: 2' $string -replace '(?s)^.*bTotal Members in Group: (d+).*$', '$1'
- 注意:
-replace
,与-match
不同,在输入 中查找所有匹配-replace
还支持输入字符串的数组,在这种情况下,每个数组元素被单独处理(-match
也这样做,但在这种情况下,不填充$Matches
;如前所述,switch
可以补救)。
-replace
的一个警告是,如果正则表达式不匹配,则输入字符串按原样返回
- 注意: