【问题标题】:how to get the value in a string using regex如何使用正则表达式获取字符串中的值
【发布时间】:2023-03-23 07:40:01
【问题描述】:

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

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

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

我的$regex 将整行返回给我,但我真正需要的是号码。

随机数

【问题讨论】:

  • 试试'Total Members in Group: (\d+)'。该数字在第一个捕获组中,而不是整个匹配项
  • 你是如何匹配你的正则表达式的?
  • 如果您使用带有单个输入字符串的-match:如果找到匹配项,$Matches.1 包含第一个也是唯一的捕获组(([\d]+),可以简化为(\d+)) 被捕获。
  • @AbdulNiyasPM 这是我不确定的地方。
  • 我仍然没有得到号码 $String = 'Total Members in Group: 2' $regex = '(?s)^.+\bTotal Members in Group: (\d+).*$' $String -match $regex 这给了我 true 但号码是多少 @mklement0

标签: regex powershell capture-group


【解决方案1】:

Fors1k's helpful answer 展示了优雅的解决方案,绕过捕获组 ((...)) - 它们是特定示例的最佳解决方案问题

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

  • 要么:使用 -matchregular-expression matching operator单个 输入字符串:如果 -match 操作返回 $true,则 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() - 有关示例,请参阅 this answer

      • 虽然-match 仅使用单个 输入字符串填充$Matches(使用数组,它充当过滤器并返回匹配输入字符串的子数组),您可以使用带有-Regexswitch 语句将-match 行为应用于输入字符串的数组;这是一个简化的例子(输出'1', '2', '3'):

        switch -Regex ('A1', 'A2', 'A3') {
          'A(.)' { $Matches.1 }
        }
        
  • 或者:使用-replaceregular-expression-based string replacement operator,匹配整个输入字符串,并将其替换为对捕获组的引用捕获的兴趣;例如,$1 指的是第一个捕获组的值。

    $string = 'Total Members in Group: 2'
    $string -replace '(?s)^.*\bTotal Members in Group: (\d+).*$', '$1'
    
    • 注意:
      • -replace-match 不同,在输入中查找 所有 匹配项
      • -replace 还支持 array 输入字符串,在这种情况下,每个数组元素都被单独处理(-match 也支持,但在这种情况下它确实填充@ 987654351@;如上所述,switch 可以解决这个问题。
      • 关于-replace 的警告是,如果正则表达式匹配,输入字符串按原样返回

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 2016-10-30
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      相关资源
      最近更新 更多