【问题标题】:How to extract a pattern of string(like IP addresses) from another string in Java如何从Java中的另一个字符串中提取字符串模式(如IP地址)
【发布时间】:2014-08-19 07:10:41
【问题描述】:

我有一个包含电子邮件标题接收部分的字符串。就像from abc.xyz.com (abc.xyz.com. [112.35.4.152]) by xx.yy.com with ESMTPS

如何从这个字符串中提取112.35.4.152

【问题讨论】:

  • 那么简单的情况是使用 indexOf 和子字符串来表示 []
  • 老实说,这个问题几乎没有或根本没有努力。
  • 说实话,袋熊,我真的迷路了。我已经尝试了所有可能的方法来做到这一点。问题是,IP 地址不一定包含 [ 和 ]。
  • "我已经尝试了所有可能的方法" 如果您尝试了所有可能的方法,那么是什么让您认为我们可以做某事不同。
  • 不要玩弄暗语。我只是想说我做了我能做的一切(至少我是这么认为的),就是这样。 stackoverflow 是不是完全不欢迎新手的地方?

标签: java string parsing


【解决方案1】:

尝试在Pattern 类中使用RegExp 方法。

String str = "from abc.xyz.com (abc.xyz.com. [112.35.4.152]) by xx.yy.com with ESMTPS id ...";
Pattern pattern = Pattern.compile("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}");
Matcher matcher = pattern.matcher(str);

if (matcher.find()) {
    System.out.println(matcher.group(0));
} else {
    System.out.println("No match.");
}

打印:

112.35.4.152

【讨论】:

    【解决方案2】:

    使用String.indexOf("") 定位您的[] 索引,将这些索引值提供给String.substring() 方法,然后提取子字符串。

    String Str="from abc.xyz.com (abc.xyz.com. [112.35.4.152]) by xx.yy.com with ESMTPS id";
    System.out.println(Str.substring((Str.indexOf("[")+1), Str.indexOf("]")) );
    

    编辑:- 请在您的问题中更加具体,我在您的 cmets 中读到 [] 中包含的 IP 地址不是保证的,在这种情况下您需要使用正则表达式。

    IPV4 ip 地址的模式是

    \\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b
    

    Reference(您也可以在此处找到 IPV6 的正则表达式)

    这是一个适合你的小 sn-p:-

     String ip_pattern ="\\b(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\b";
     String input="from abc.xyz.com [112.35.4.152](abc.xyz.com. by xx.yy.com with ESMTPS id ";
     Pattern pattern = Pattern.compile(ip_pattern);
     Matcher matcher = pattern.matcher(input);
    
     if (matcher.find()) {
         System.out.println(matcher.group());
      }
     else{
         System.out.println("No ip found in given input");
      }
    

    【讨论】:

    • 什么评论?请更具体。
    • 谢谢穆斯塔法。由于我的声誉很低,我无法对您的回答投赞成票,但我非常感谢您的帮助。
    • @joiner 指的是对我的回答投反对票的人,如果你没有投反对票,那不适合你。
    • @technophyle 没问题,乐于助人:)
    • 好的,我删除了我的 cmets。删除你的。
    【解决方案3】:
    "from abc.xyz.com (abc.xyz.com. [112.35.4.152]) by xx.yy.com with ESMTPS id ...".
    

    通过查看您的String,您可以在[ 之后获得一个以] 结尾的子字符串

    String s = "from abc.xyz.com (abc.xyz.com. [112.35.4.152]) by xx
                                                        .yy.com with ESMTPS id ...";
    int startIndex=s.indexOf("[");
    int endIndex=s.indexOf("]");
    System.out.println(s.substring(startIndex+1,endIndex));
    

    输出:

    112.35.4.152
    

    了解String#substring()

    【讨论】:

      【解决方案4】:

      试试这个

      String IPADDRESS_PATTERN = 
          "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
      
      Pattern pattern = Pattern.compile(IPADDRESS_PATTERN);
      Matcher matcher = pattern.matcher(ipString);
          if (matcher.find()) {
              return matcher.group();
          }
          else{
              return "0.0.0.0";
          }
      

      Credits:Extract ip address from string in java

      【讨论】:

      • 你从字面上复制粘贴了答案.....假设我做了-1,哦等等......some1已经做到了!
      • 我认为更简单的\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b 会起作用
      猜你喜欢
      • 2013-05-25
      • 2011-02-22
      • 2019-08-09
      • 1970-01-01
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      • 2018-01-01
      相关资源
      最近更新 更多