如何使用C#

时间:2015-08-28 18:10:33

标签: c# regex

我已经看过如何在java中做到这一点,但是没有成功获得结果或者找到关于如何使用C#执行此操作的答案,所以就这样了。

我有一个定期ping结果的字符串:

var result = "PING skye.net (xxx.xxx.xxx.xxx): 200 data bytes" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=253 time=1.759 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=253 time=2.075 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=253 time=1.843 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=253 time=1.803 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=253 time=17.898 ms" +
   "--- skye.net ping statistics ---" +
   "5 packets transmitted, 5 packets received, 0% packet loss" +
   "round-trip min/avg/max = 1.759/5.075/17.898 ms";

我希望通过一次Regex.Match或Regex.Matches调用获得传输,接收和丢失结果。

对于每个部分,我都有单独的正则表达式模式:
- (\ d +)\ spackets \ stransmitted
- (\ d +)\ spackets \ sreceived
- (\ d +%)\ spacket \ sloss

它们可以与Regex.Match一起使用。

所以不要这样做:

var result = "PING skye.net (xxx.xxx.xxx.xxx): 200 data bytes" +
    "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=253 time=1.759 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=253 time=2.075 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=253 time=1.843 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=253 time=1.803 ms" +
   "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=253 time=17.898 ms" +
   "--- skye.net ping statistics ---" +
   "5 packets transmitted, 5 packets received, 0% packet loss" +
   "round-trip min/avg/max = 1.759/5.075/17.898 ms";

const string patternForTransmitted = @"(\d+)\spackets\stransmitted";
const string patternForReceived = @"(\d+)\spackets\sreceived";
const string patternForLoss = @"(\d+%)\spacket\sloss";

var transmitted = Match(patternForTransmitted, result);
var received = Match(patternForReceived, result);
var loss = Match(patternForLoss, result);

我想做这样的事情:

    var result = "PING skye.net (xxx.xxx.xxx.xxx): 200 data bytes" +
        "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=253 time=1.759 ms" +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=253 time=2.075 ms" +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=253 time=1.843 ms" +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=253 time=1.803 ms" +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=253 time=17.898 ms" +
       "--- skye.net ping statistics ---" +
       "5 packets transmitted, 5 packets received, 0% packet loss" +
       "round-trip min/avg/max = 1.759/5.075/17.898 ms";

var pattern = @"((\d+)\spackets\stransmitted)((\d+)\spackets\sreceived)((\d+%)\spacket\sloss)";

var matches = Regex.Matches(pattern, result);

可行吗?

谢谢。

4 个答案:

答案 0 :(得分:0)

正则表达式是这样的:

var pattern =@"((\d+)\spackets\stransmitted)|((\d+)\spackets\sreceived)|((\d+%)\spacket\sloss)";

Demo

答案 1 :(得分:0)

正确的正则表达式是:

@"(\d+)\spackets\stransmitted.*(\d+)\spackets\sreceived.*(\d+%)\spacket\sloss"

测试here

答案 2 :(得分:0)

@Oleh的答案是正确的,但如果你只需要数值,那就试试这个:

var pattern = @"(\d+)\spackets\stransmitted|(\d+)\spackets\sreceived|(\d+%)\spacket\sloss"

演示:https://regex101.com/r/mF3pY3/2

答案 3 :(得分:0)

这有效:

    var result = "PING skye.net (xxx.xxx.xxx.xxx): 200 data bytes " +
        "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=0 ttl=253 time=1.759 ms " +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=1 ttl=253 time=2.075 ms " +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=2 ttl=253 time=1.843 ms " +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=3 ttl=253 time=1.803 ms " +
       "208 bytes from xxx.xxx.xxx.xxx: icmp_seq=4 ttl=253 time=17.898 ms " +
       "--- skye.net ping statistics --- " +
       "5 packets transmitted, 6 packets received, 7% packet loss " +
       "round-trip min/avg/max = 1.759/5.075/17.898 ms ";

var pattern = @"(\d+)\spackets\stransmitted, (\d+)\spackets\sreceived, (\d+%)\spacket\sloss";

var matches = Regex.Match(result, pattern);

Console.WriteLine(matches.Groups[1].Captures[0].Value);
Console.WriteLine(matches.Groups[2].Captures[0].Value);
Console.WriteLine(matches.Groups[3].Captures[0].Value);

您可以调整空白等,但我认为现在的关键是访问返回结果中的组。你的电话中也有结果和模式反转。

我也会从捕获中取出%,但那就是我。