如何使用正则表达式获得字符串中的值



我对如何在下面的字符串中获得数字感到困惑。我制作了一个正则表达式

$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的一个警告是,如果正则表达式不匹配,则输入字符串按原样返回

相关内容

  • 没有找到相关文章

最新更新