【问题标题】:Java split with certain paternJava 以特定模式拆分
【发布时间】:2015-08-08 03:43:55
【问题描述】:
String abc ="abc_123,low,101.111.111.111,100.254.132.156,abc,1";
String[] ab = abc.split("(\\d+),[a-z]");
System.out.println(ab[0]);

预期输出:

abc_123
low
101.111.111.111,100.254.132.156
abc
1

问题是我无法为这种模式找到合适的正则表达式。

【问题讨论】:

  • 正确的正则表达式是什么?您如何决定何时使用逗号?

标签: java regex


【解决方案1】:

我建议不要用一个正则表达式解决所有问题。

您的初始字符串似乎包含用“,”分隔的值。所以用“,”分割这些值。

然后迭代该过程的输出;并“加入”那些是 IP 地址的元素(看起来这就是您要寻找的)。

只是为了它:请记住,IP 地址实际上非常复杂;可以找到“匹配 em all”的模式 here

【讨论】:

    【解决方案2】:
    String[] ab = abc.split(",");
    System.out.println(ab[0]);
    System.out.println(ab[1]);
    int i = 2;
    while(ab[i].matches("[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}")) {
        if(i > 2) System.out.print(",");
        System.out.print(ab[i++]);
    }
    System.out.println();
    System.out.println(ab[i++]);
    System.out.println(ab[i++]);
    

    【讨论】:

    • 这并不总是我们必须连接 ab[2]ab[3] 只是这可能更少或更多。String 可以像 abc_123,low,101.111.111.111,100.254.132.156,101.111.111.111,abc,1
    • 未指定...然后我们可以像上面那样(已编辑)
    【解决方案3】:

    您可以使用lookahead 和lookbehind 来检查3 位数字和正确位置的. 是否在, 之前或之后:

    String[] ab = abc.split("(?<!\\.\\d{3}),|,(?!\\d{3}\\.)");
    

    【讨论】:

      【解决方案4】:

      首先通过,将它们拆分为数组,然后应用正则表达式检查它是否是所需的甲酸盐。如果是,则将所有这些用,分隔

      String abc ="abc_123,low,101.111.111.111,100.254.132.156,abc,1";//or something else.
      String[] split = abc.split(",");
      String concat="";
      for(String data:split){
      
      boolean matched=data.matches("[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}");
      if(matched){
      concat=concat+","+data;
      }else{
      System.out.println(data);
      }
      }
      if(concat.length()>0)
      System.out.println(concat.substring(1));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-15
        • 1970-01-01
        • 1970-01-01
        • 2018-10-23
        • 2018-04-04
        • 2010-11-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多