多线正则表达式只捕获powershell中最后一个结果数?

时间:2014-09-02 12:17:13

标签: regex powershell global

我只想获得ping返回的最后一个数字:

    $s = ping 129.69.1.153 | out-string
    $s
    if ( $s -match '(?m).+(\d+)ms' ) {
        $Matches
    }
谷歌告诉(?m)是多线的,而且应该尽可能地贪婪 但我得到的只是第二行的最后一个数字而不是最后一行????

     Ping wird ausgeführt für 129.69.1.153 mit 32 Bytes Daten:
     Antwort von 129.69.1.153: Bytes=32 Zeit=31ms TTL=51
     Antwort von 129.69.1.153: Bytes=32 Zeit=26ms TTL=51
     Antwort von 129.69.1.153: Bytes=32 Zeit=27ms TTL=51
     Antwort von 129.69.1.153: Bytes=32 Zeit=25ms TTL=51

     Ping-Statistik für 129.69.1.153:
        Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
         (0% Verlust),
     Ca. Zeitangaben in Millisek.:
        Minimum = 25ms, Maximum = 31ms, Mittelwert = 27ms

     match: ..
     Name                           Value                                                                 
     ----                           -----                                                                 
     1                              31                                                                    
     0                              Antwort von 129.69.1.153: Bytes=32 Zeit=31ms                          

即使是

     $s.Replace("`n","").Replace("`r","")
ping之后和匹配之前的

是否匹配第二行的ms?

知道如何以简单的方式解决这个简单的请求吗?

感谢您的回答,但是我喜欢这种方式(s.b.):

    $s = ping 129.69.1.153 | out-string
    if ( $s -match '(?s).+\D(\d+)ms' ) { $Matches }

(?s)做到了:

     Ping wird ausgeführt für 129.69.1.153 mit 32 Bytes Daten:
     Antwort von 129.69.1.153: Bytes=32 Zeit=25ms TTL=51
     Antwort von 129.69.1.153: Bytes=32 Zeit=27ms TTL=51
     Antwort von 129.69.1.153: Bytes=32 Zeit=25ms TTL=51
     Antwort von 129.69.1.153: Bytes=32 Zeit=27ms TTL=51

     Ping-Statistik für 129.69.1.153:
         Pakete: Gesendet = 4, Empfangen = 4, Verloren = 0
         (0% Verlust),
     Ca. Zeitangaben in Millisek.:
         Minimum = 25ms, Maximum = 27ms, Mittelwert = 26ms

     match: ..

     Name                 Value                                                                         
     ----                 -----                                                                         
     1                    26                                                                            
     0                    ...

我不知道为什么 - 但它确实有效。

3 个答案:

答案 0 :(得分:1)

看起来字符串末尾有一个隐藏空间,这就是正则表达式出现问题的原因。这是有效的,只是测试了它。

($s.trim() | select-string "\d+(?=ms$)").Matches.Value

或者你可以做到这一点,但我认为首先修剪空间会更好

($s | select-string "\d+(?=ms\s*$)").Matches.Value

答案 1 :(得分:0)

如果您有更新的Powershell版本

,可以尝试使用Test-Connection进行试验

如果没有,我建议如下(因为正则表达式几乎不是一个好主意)

$Tempfile = [System.IO.Path]::GetTempFileName()
$s = ping 129.69.1.153 | out-file $Tempfile
cat $Tempfile | Select-string "Antwort" | Select -last 1
Remove-item $Tempfile -force

答案 2 :(得分:0)

如果我正在寻找Mittelwert = 27ms或数字27,那么因为您正在引用ping中的最后一个数字。

如果是这种情况,您可以在比赛中查找该单词。

$s -match "Mittelwert\s+=\s+(\d+)ms"

您可以在匹配中使用命名组

$s -match "Mittelwert\s+=\s+(?<Anzahl>\d+)ms"

这样您就可以运行以下代码来代替$matches

$matches.Anzahl