这种 是一个完善的解决办法
import java.util.ArrayList; import java.util.List; public class strtest { /** * @param args */ public static void main(String[] args) { String str=",hhh,\"11,1\",aaaaa,bbbbb,ccc\"ddd,eee,ff\"\"f,gggg\"hhhh,,,iii,jjj\"kkk,lll\"mmm,888\"888\"888,\"9\"0,a,"; int i=str.length(); int chg=1; //存储需要分裂的逗号位置 List<Integer> subStr=new ArrayList<Integer>(); for(int a=0;a<i;a++){ char charStr = str.charAt(a); //逗号不在第一个位置的话要从0开始截取字符串 if(a==0){ if(charStr!=",".charAt(0)){ subStr.add(0); } //逗号在第一个位置的时候要在前面留取一个空位 else{ subStr.add(0); } } if(charStr=="\"".charAt(0)){ //引号之内的时候标志位都是-1 chg=chg*-1; }else if(charStr==",".charAt(0)){ //引号之外的逗号要记录位置 if(chg==1){ subStr.add(a); } //引号之内的逗号就不用记录位置了 else if(chg==-1){ } } } // System.out.println(subStr); // System.out.println(str.length()); //最后一个位置不是逗号的话 字符串要截取到最后一位,注意这个最后一位是字符串的长度 if(subStr.get(subStr.size()-1)!=str.length()-1){ subStr.add(str.length()); } //最后一位是逗号的话也要 else{ subStr.add(str.length()); } List<String> strFin = new ArrayList<String>(); //开始截取 int q=1; for(int z=0;z<subStr.size();z++){ int startInt=subStr.get(z); //只有第一个位置是从0开始并且不用开始位置+1 if(z!=0){ startInt=startInt+1; } if(z!=subStr.size()-1){ int endInt=subStr.get(z+1); String cur=str.substring(startInt, endInt); strFin.add(cur); System.out.println("No."+q+": "+cur); } q++; } } }
结果:
No.1:
No.2: hhh
No.3: "11,1"
No.4: aaaaa
No.5: bbbbb
No.6: ccc"ddd,eee,ff""f,gggg"hhhh
No.7:
No.8:
No.9: iii
No.10: jjj"kkk,lll"mmm
No.11: 888"888"888
No.12: "9"0
No.13: a
No.14:
优化之后的写法,结果同上
import java.util.ArrayList; import java.util.List; public class strtest { /** * @param args */ public static void main(String[] args) { String str=",hhh,\"11,1\",aaaaa,bbbbb,ccc\"ddd,eee,ff\"\"f,gggg\"hhhh,,,iii,jjj\"kkk,lll\"mmm,888\"888\"888,\"9\"0,a,"; int i=str.length(); int chg=1; //存储需要分裂的逗号位置 List<Integer> subStr=new ArrayList<Integer>(); //逗号不在第一个位置的话要从0开始截取字符串 //逗号在第一个位置的时候要在前面留取一个空位 subStr.add(0); for(int a=0;a<i;a++){ char charStr = str.charAt(a); if(charStr=='\"'){ //引号之内的时候标志位都是-1 chg=chg*-1; }else if(charStr==','){ //引号之外的逗号要记录位置 if(chg==1){ subStr.add(a); } } } //最后一个位置不是逗号的话 字符串要截取到最后一位,注意这个最后一位是字符串的长度 //最后一位是逗号的话也要,截取到最后一位 subStr.add(str.length()); List<String> strFin = new ArrayList<String>(); //开始截取 int q=1; for(int z=0;z<subStr.size();z++){ int startInt=subStr.get(z); //只有第一个位置是从0开始并且不用开始位置+1 if(z!=0){ startInt=startInt+1; } if(z!=subStr.size()-1){ int endInt=subStr.get(z+1); String cur=str.substring(startInt, endInt); strFin.add(cur); System.out.println("No."+q+": "+cur); } q++; } } }
另一种写法 有点小bug
public class Test { public static void main(String[] args) { String str = ",hhh,\"11,1\",aaaaa,bbbbb,ccc\"ddd,eee,fff,gggg\"hhhh,,,iii,jjj\"kkk,lll\"mmm,888\"888\"888,\"999\""; int num = 0; int result = 0; String str1 = ""; for (int i = 0; i < str.length(); i++) { char n = str.charAt(i); if (n != ',' && i == str.length() - 1) { result++; System.out.println("str" + result + ":" + str1 + n); } if (n == '\"') { num++; str1 = str1 + n; } else if (num % 2 == 0 && n == ',') { result++; System.out.println("str" + result + ":" + str1); str1 = ""; } else { str1 = str1 + n; } } } }
str1:
str2:hhh
str3:"11,1"
str4:aaaaa
str5:bbbbb
str6:ccc"ddd,eee,fff,gggg"hhhh
str7:
str8:
str9:iii
str10:jjj"kkk,lll"mmm
str11:888"888"888
str12:"999"