这种 是一个完善的解决办法
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"