【问题标题】:How to Get Regex to Return Digits Before String如何让正则表达式在字符串之前返回数字
【发布时间】:2017-04-23 00:38:02
【问题描述】:

这是我尝试使用正则表达式通过 PowerShell 解析的示例字符串。

04/22/17 19:16:44   77.9    BATT    Min: 00.0   Max: 100.0

这是我获取数字的正则表达式:

'\d+\.\d'

我想要做的是专门获取字符串 (BATT) 之前的数字 (77.9)。我可以通过以下方式获得 77.9 和 BATT:

(\d+\.\d)\s+BATT

虽然我只需要它自己的数字,但我不确定如何正确展望未来。

【问题讨论】:

    标签: regex powershell parsing


    【解决方案1】:

    有效的前瞻类似于“匹配一个数字(前瞻后跟空格,然后是 BATT)。在此示例中,查找“一个或多个非空格”以获取数字:

    PS C:\> $s = '04/22/17 19:16:44   77.9    BATT    Min: 00.0   Max: 100.0'
    
    PS C:\> $s -match '\S+(?=\s+BATT)'
    True
    
    PS C:\> $Matches
    
    Name                           Value                                                                                                                                                                        
    ----                           -----                                                                                                                                                                        
    0                              77.9      
    

    但是查看您的数据,正则表达式是多余的。它是一个日期、一个时间、一个数字 - 用空格分隔并取第三件事:

    PS C:\> (-split $s)[2]
    77.9
    

    关于正则表达式的话题,我更喜欢“替换你不想要的”而不是“匹配你做什么”的正则表达式,因为它们是一步操作,你不必处理带有匹配和组提取:

    PS C:\> $s -replace '.*?(\S+)\s+BATT.*', '$1'
    77.9
    

    【讨论】:

      【解决方案2】:

      您根本不需要前瞻。你的(\d+\.\d)\s+BATT 正则表达式是正确的,你只需要选择第一组:

      $input = "04/22/17 19:16:44   77.9    BATT    Min: 00.0   Max: 100.0"
      $match = $input -match "(\d+\.\d)\s+BATT"
      if( $match ) {
          $value = $match[1]
          Write-Host $value
      }
      

      给我这个输出:

      77.9
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-07
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 2013-11-04
        • 1970-01-01
        相关资源
        最近更新 更多