Regex 多行正则表达式仅捕获结果的最后一个数字在powershell中失败?

Regex 多行正则表达式仅捕获结果的最后一个数字在powershell中失败?,regex,powershell,global,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:

我只想得到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)的作用是:


我不知道为什么-但它可以工作。

如果您有更新的Powershell版本,您可以尝试测试连接

如果不是,我建议如下(因为Regex从来都不是一个好主意)


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

($s.trim() | select-string "\d+(?=ms$)").Matches.Value
或者你也可以这样做,但我认为首先修剪空间会更好

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

如果我的假设是您正在查找
Mittelwert=27ms
或编号
27
,因为您指的是ping中的最后一个编号

如果是这样的话,你可以在匹配中查找这个词

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

您可以在比赛中使用命名组

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

您的Powershell版本是什么?测试连接内置于cmdlet中,用于执行类似于ping(ICMP数据包)的操作。您可以显示您试图捕获的内容吗?请求不清楚…您想要最后的响应时间吗?那么从你的样本数据来看是25毫秒?@Noah Sparks:我想要27毫秒,这是平均值:Mittelwert=27毫秒。这是最后一个号码。我找到了有效的匹配!不要使用(?m)多行,而是(?s)单行:if($s-match'(?s)。+\D(\D+ms'){$Matches}-funnyRegex究竟是不是一个好主意?相反,你应该为更简单的事情编写过多无用的代码?这只是个人观点,因为正则表达式是完全非直觉的(至少它不符合我的直觉)。Regex如何比我发布的实际代码更简单
selectstring
基于regex进行搜索,但返回行(正如
grep
所做的那样)。通过这种方式,OP可以搜索关键字并选择适当的语句(在ping的情况下,它将始终是一个常量值)
($s | select-string "\d+(?=ms\s*$)").Matches.Value
$s -match "Mittelwert\s+=\s+(\d+)ms"
$s -match "Mittelwert\s+=\s+(?<Anzahl>\d+)ms"
$matches.Anzahl