我在包含+ - 和|的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);
并且它没有用
答案 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然后只有上面的子串代码使用原始代码