【问题标题】:Parse Plain Text解析纯文本
【发布时间】:2013-07-28 21:21:18
【问题描述】:

如何解析这个字符串:

PING 192.168.1.2 (192.168.1.2) 56(84) 字节数据。来自 192.168.1.2 的 64 字节:icmp_seq=1 ttl=64 时间=0.244 ms64 字节来自 192.168.1.2:icmp_seq=2 ttl=64 时间=0.274 ms64 字节来自 192.168.1.2:icmp_seq=3 ttl=64 时间=0.275 ms64 字节来自 192.168.1.2:icmp_seq=4 ttl=64 时间=0.306 ms64 字节来自 192.168.1.2:icmp_seq=5 ttl=64 时间=0.550 ms--- 192.168.1.2 ping统计---5个包发送,5个接收,0%丢包,时间4001msrtt min/avg/max/mdev = 0.244/0.329/0.550/0.114 ms

我尝试使用StringTokenizer,但没有得到合适的结果。

我试过的代码如下:

StringTokenizer tokens = new StringTokenizer(pingResult, ":");
String first = tokens.nextToken();// this will contain "Fruit"
String second = tokens.nextToken();

【问题讨论】:

  • 解析后的字符串结果应该是什么??
  • 预期输出是什么?
  • @BrijeshThakur 预期结果应为“icmp_seq=1 ttl=64 time=0.244 ms”

标签: java parsing plaintext


【解决方案1】:

您可以使用字符串拆分方法。

ArrayList<String> ResultTab= new ArrayList<String>();
    String pingResult = "PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.244 ms64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.274 ms64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.275 ms64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.306 ms64 bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.550 ms--- 192.168.1.2 ping statistics ---5 packets transmitted, 5 received, 0% packet loss, time 4001msrtt min/avg/max/mdev = 0.244/0.329/0.550/0.114 ms";
    String[] pingResultTab = pingResult.split(":");
    for (int i = 0; i < pingResultTab.length; i++) {
        System.out.println(pingResultTab[i]);
        if(i >= 1)
        {
            String[] itTab = pingResultTab[i].split("ms");
            ResultTab.add(itTab[0]);


        }

    }
    System.out.println("---RESULTAT-------");
    for (String result : ResultTab) {
        System.out.println(result);

    }

【讨论】:

  • 我猜上面的解决方案会给你“icmp_seq=1 ttl=64 time=0.244 ms64 bytes from 192.168.1.2”,这是意料之外的。
【解决方案2】:

试试这个,

 while(tokens.hasMoreElements())
{
   String subStringValue = tokens.nextToken();
   System.out.println("token : " + StringUtils.substringBetween(subStringValue, "", "ms")+"ms");
}

StringUtils.substringBetween

【讨论】:

    【解决方案3】:

    单独StringTokenizer 是行不通的。使用StringTokenizersubstring 可以达到预期的效果。即StringTokenizer 将提供标记为“icmp_seq=1 ttl=64 time=0.244 ms64 bytes from 192.168.1.2”。您可以从标记化的字符串中执行子字符串。类似:

    String finalString=tokenizedString.substring(0,tokenizedString.indexOf(ms)+1);
    

    虽然答案有点脏,但它解决了目的。

    【讨论】:

      【解决方案4】:

      尝试正则表达式匹配:

      public static void findMatch(){
              String str = "PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.64 bytes from 192.168.1.2" +
                      ": icmp_seq=1 ttl=64 time=0.244 ms64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.274 ms64 " +
                      "bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=0.275 ms64 bytes from 192.168.1.2: icmp_seq=4 ttl=64 time=0.306 ms64 " +
                      "bytes from 192.168.1.2: icmp_seq=5 ttl=64 time=0.550 ms--- 192.168.1.2 ping statistics ---5 packets transmitted, " +
                      "5 received, 0% packet loss, time 4001msrtt min/avg/max/mdev = 0.244/0.329/0.550/0.114 ms";
      
              String regexPattern = "icmp_seq=\\d+ ttl=\\d+ time=.+?ms";
              Pattern pattern = Pattern.compile(regexPattern);
      
              Matcher matcher = pattern.matcher(str);
      
              while (matcher.find()){
                  System.out.println(str.substring(matcher.start(), matcher.end()));
              }
          }
      

      结果:

      icmp_seq=1 ttl=64 时间=0.244 毫秒

      icmp_seq=2 ttl=64 时间=0.274 毫秒

      icmp_seq=3 ttl=64 时间=0.275 毫秒

      icmp_seq=4 ttl=64 time=0.306 ms

      icmp_seq=5 ttl=64 时间=0.550 毫秒

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-08
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        • 2013-08-15
        • 2013-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多