如何让正则表达式在字符串之前返回数字

时间:2017-04-23 00:38:02

标签: regex powershell parsing

这是我的示例字符串,我正在尝试使用Regex解析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

我只需要自己的数字,但我不确定如何正确地预测这一点。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

有效的前瞻将是"匹配一个数字(前瞻,其后是空格,然后是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