Java按特定模式分割字符串

4
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

问题在于我找不到适合这种模式的正则表达式。


1
什么是正确的正则表达式?你如何决定在逗号处中断? - Evan Knowles
4个回答

7
我建议不要用一个正则表达式来解决所有问题。
似乎你的初始字符串包含由“,”分隔的值。所以使用“,”拆分这些值。
然后迭代该过程的输出,并“连接”那些是IP地址的元素(因为这似乎是你寻找的内容)。
只为了说明一下:请记住,IP地址实际上非常复杂;可以在此处找到“匹配全部”的模式。

1
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 这样。 - user4768611
没有被指定...然后我们可以像上面那样(已编辑) - zborek

1
你可以使用前瞻和后顾来检查是否在逗号,之前或之后有三个数字和一个.在正确的位置:
String[] ab = abc.split("(?<!\\.\\d{3}),|,(?!\\d{3}\\.)");

1

首先,通过,将它们拆分成数组,然后应用正则表达式来检查它们是否符合所需格式。如果是,则将所有这些内容连接起来,用,分隔。

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));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接