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

how to get the value in a string using regex

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

$regex = '(?s)^.+\bTotal Members in Group: ([\d.]+).*$'

我只需要一个长字符串中的数字部分 2 一行 Total Members in Group: 2.

我的 $regex returns 我整条线,但我真正需要的是号码。

号码随机

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

显示优雅的解决方案,绕过 对捕获组的需要 ((...)) - 它们是最佳解决方案问题中的具体示例。

回答关于如何提取子字符串的一般问题 如果需要捕获组 ,PowerShell 惯用的方法是:

  • 或者:使用-matchregular-expression matching operator with a single input string: if the -match operation returns $true, the automatic $Matches variable反映了正则表达式捕获的内容,属性(关键) 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(使用 数组 ,它充当 过滤器 和 returns 匹配输入字符串的子数组),您可以将 switch 语句与 -Regex 一起使用将 -match 行为应用于 数组 输入字符串;这是一个简化的例子(输出 '1', '2', '3'):

        switch -Regex ('A1', 'A2', 'A3') {
          'A(.)' { $Matches.1 }
        }
        
  • 或者:使用-replace,regular-expression-based string replacement operator,匹配整个输入字符串并将其替换为对感兴趣的捕获组捕获内容的引用;例如,</code> 指的是第一个捕获组的值。</p> <pre><code>$string = 'Total Members in Group: 2' $string -replace '(?s)^.*\bTotal Members in Group: (\d+).*$', ''

    • 注意:
      • -replace,与 -match 不同,在输入
      • 中查找 所有 匹配项
      • -replace 还支持输入字符串的 array,在这种情况下,每个数组元素都单独处理(-match 也是如此,但在那种情况下它不会填充$Matches;如前所述,switch可以解决这个问题。
      • 关于 -replace 的警告是,如果正则表达式 匹配,则 输入字符串按原样返回