防止字符串Split上的空值

时间:2018-05-26 21:06:53

标签: java split

我在包含+ - 和|的String上使用了Split方法而且我不想得到那个空值,这里是我的代码

public class Test {

   public static void main(String args[]) {

     String ab="+computer-science|lambda+sigma";
     String[] lesAndz = ab.split("[\\W]");
     for(int i=0;i<lesAndz.length;i++){
                    System.out.println(i+" : ["+lesAndz[i]+"]");

      }

}

}

我希望它输出

0 : [computer]
1 : [science]
2 : [lambda]
3 : [sigma]

但即将到来

0 : []
1 : [computer]
2 : [science]
3 : [lambda]
4 : [sigma]

我试过

String[] lesAndz = ab.split("[\\W]", -1);

并且它没有用

6 个答案:

答案 0 :(得分:0)

您可以使用子字符串切断第一个字符:

String ab = "+computer-science|lambda+sigma";
String[] lesAndz;
if(Character.toString(ab.charAt(0)).matches("[\\W]")) {
    lesAndz = ab.substring(1,ab.length()).split("[\\W]");
} else {
    lesAndz = ab.split("[\\W]");
}
for(int i=0;i<lesAndz.length;i++){
    System.out.println(i+" : ["+lesAndz[i]+"]");
}

输出:

0 : [computer]
1 : [science]
2 : [lambda]
3 : [sigma]

适用于两者,以字母数字开头的字符串和以非字母数字字符开头的字符串,例如:

  • +computer-science|lambda+sigma
  • computer-science|lambda+sigma

答案 1 :(得分:0)

根据Java Doc, https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#split(java.lang.String)

将不包括尾随空字符串,但前导空字符串将是。您只需要另外检查以查看前导字符串是否为空并将其从列表中删除。

答案 2 :(得分:0)

我会用空格替换分隔符。然后你可以使用trim()在拆分之前删除任何一端的额外字符。我假设你不希望结果中有任何空字符串,所以我稍微改变了表达式。

ab.replaceAll("\\W+", " ").trim().split(" ")

答案 3 :(得分:0)

您可以查看this one。这家伙有同样的问题。你可以得到一些线索。

答案 4 :(得分:0)

您不能这样做(丢弃前导/所有空值......至少不使用java.langString#split()),因为:

  

当此字符串开头有正宽度匹配时   然后在开头包含一个空的前导子字符串   结果数组。然而,开头的零宽度匹配......

+有一个正宽度匹配......

据我了解,您可以阻止/省略尾随空字符串...然后使用split(rex, 0)split(rex)

...和(例如)"+some+thing++foo++++++++".split("\\W"),您仍会获得{"", "some", "thing", "", "foo"}

(推荐) - &gt; lambda表达式或一些自己的/ org.apache ... StringUtils包装器。

...或者使用replace()进行双重调用,按照接受的答案,很好!洛尔

答案 5 :(得分:0)

在拆分之前,检查ab.indexOf(“”)== 0然后只有上面的子串代码使用原始代码