java 分解含有双引号的字符串

 

 这种 是一个完善的解决办法

 

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"

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值