关于java的split方法的学习
在日常工作中,由于经常要进行字符串的拼接操作,所以String自带的split(String regex)方法经常使用。split方法是把一个字符串对象,根据分隔符,将该字符串分割成一个字符串数组,例子如下eg1所示:
eg1:
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
sb.append("hello").append("-").append("the").append("-").append("world");
String[] result = sb.toString().split("-");
for(String temp : result)
{
System.out.println(temp);
}
}
输出结果:

从eg1中我们可以知道split的用法,以及使用场景。但是在工作中我遇到这样一种情况,就是分隔符之间为空,但是仍然是包含有一个字段的,只不过这个字段是"",这个时候用split的话就有可能出现问题,例子如eg2所示
eg2:
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
sb.append("hello").append("-").append("").append("-").append("");
String[] result = sb.toString().split("-");
System.out.println("result length:" + result.length);
}
输出结果:
在eg2中,按照我们的设想,result数组的长度应该是3,除了第一个hello外,其余应该还有两个"",但是split方法直接忽略了字符串后面的""。针对这个情况,有如下两种解决方法,第一个方法是利用split()的另外一个多态方法split(String regex, int limit),将limit为-1,即可以完整解析整个字符串。见eg3
eg3:
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
sb.append("hello").append("-").append("").append("-").append("");
String[] result = sb.toString().split("-", -1);
System.out.println("result length:" + result.length);
}
输出结果:
![]()
第二个解决方式是笔者自己利用java原生的split(String regex)方法, 写了一个方法,可以实现任何情况下的字符串分割(解决了以上的问题),见eg4:
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
sb.append("hello").append("-").append("").append("-").append("");
String[] result = split(sb.toString(), "-");
System.out.println("result length:" + result.length);
}
public static String[] split(String str, String regex)
{
String[] result = null;
if(str.lastIndexOf(regex) != str.length()-1)
{
result = str.split(regex);
}
else
{
int count = 0;
int index = str.length();
int regLength = regex.length();
while (true) {
String tmp = str.substring(index - regLength, index);
if (!tmp.equals(regex)) {
break;
}
if (index < 0) {
index = 0;
break;
}
index = index - regLength;
count++;
}
String[] resultmp = str.substring(0, index).split(regex);
List<String> list = new ArrayList<String>();
for(String strs : resultmp)
{
list.add(strs);
}
while(count != 0)
{
list.add("");
count--;
}
result = list.toArray(new String[0]);
}
return result;
}
输出结果:



浙公网安备 33010602011771号