`
robinrain
  • 浏览: 60716 次
  • 性别: Icon_minigender_1
  • 来自: 威海
社区版块
存档分类
最新评论

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"

 

 

 

分享到:
评论

相关推荐

    编绎原理词法分析和字符串识别-java

    在Java中,字符串是类`String`的对象,因此在词法分析时,需要识别出以双引号开始和结束的字符序列,并将其转换为对应的`String`对象。这个过程中,词法分析器还需要处理转义字符,如"\n"表示换行,"\t"表示制表符。...

    第06章 字符串操作.pdf

    - **字符串**:由双引号括起来的一系列字符构成,例如 `"Hello World!"`。在Java中,字符串不是基本类型,而是作为一个不可变的对象,即 `String` 类的一个实例来处理。 ##### 2. `String` 类及其构造函数 - **...

    实验7 数组、向量与字符串.doc

    字符串可以使用双引号或单引号括起来。字符串可以进行连接、截取、比较等操作。 在实验中,学生需要编写一个 Java Applet 程序,接受用户输入的一个文件名,然后截取其后缀,根据其后缀判断文件的类型。 通过完成...

    Java简易词法分析器

    4. **字符串(String)**:用双引号包围的字符序列,如"Hello, World!"。 5. **符号(Punctuation)**:包括各种界符,如分号`;`、逗号`,`、括号`()`、`[]`、`{}`等。 6. **操作符(Operator)**:如`+`、`-`、`*`...

    Java词法分析实验报告

    ", ",", "(", ")", "{", "}", 和双引号(")"用于分隔和标记代码的不同部分。在Java实现中,它们被定义为一个字符数组`bounder`。 3. **文件读取**:为了处理输入的C语言源代码,实验使用了`FileReader`和`...

    Building Java Programs.ppt

    字符串字面量是用双引号包围的字符序列,如"Hello, world!"。转义序列如`\n`表示换行,`\t`表示制表符,它们允许在字符串中插入特殊字符。 6. 静态方法与过程性分解 静态方法属于类而不是类的实例,可以不创建...

    自制脚本语言的LR(1)编译器与解释器

    3. **字符串处理**:脚本语言通常需要支持字符串字面量,包括单引号和双引号字符串。解析器需要识别字符串的开始和结束,并处理转义字符。在处理字符串时,还要考虑到字符串连接操作,例如两个相邻的字符串字面量在...

    Java 实现词法分析器

    例如,如何高效地处理长字符串,如何优化错误报告以提高用户体验,以及如何通过单元测试确保分析器的准确性。 总之,"Java 实现词法分析器"是一个涵盖了编译原理基础的项目,它不仅涉及到Java编程,还涉及到形式...

    java 语言基础课件

    字符串是由双引号包围的字符序列。 理解这些基础知识对于学习和掌握Java编程至关重要。通过深入学习,可以进一步了解如何创建变量、进行运算、控制流程、处理异常以及实现面向对象的编程概念。熟练掌握Java语言基础...

    Json 数据解析

    - 值:可以是字符串(双引号包围),数字,布尔值(true/false),null,对象或数组。 2. JSON解析的两种常见方式: - 手动解析:通过字符串操作,如JavaScript中的split()、substring()等方法,或者正则表达式,...

    jls11java语言规范.pdf

    - **字符串文字**:由双引号括起来的一系列字符。 - **转义序列**:例如`\n`代表换行符。 - **空文字**:`null`关键字表示没有值的对象引用。 - **分隔符**:列举了用于分隔不同元素的符号。 - **运算符**:介绍...

    Java词法分析

    数值常量可以是十进制、八进制或十六进制,字符串常量则用双引号括起来。 4. 运算符:如加减乘除、赋值、比较、逻辑等运算符,以及特殊的位运算符。 5. 分隔符:包括括号、逗号、分号等,它们在源代码中起着分隔和...

    词法分析 java编写

    6. **字符串**:在Java中,字符串是一个字符序列,通常用双引号包围,如`"Hello, World!"`。它们是对象,属于`String`类。 7. **注释**:Java支持单行注释(//)、多行注释(/* ... */)和文档注释(/** ... */),...

    java笔记整理(超详细)

    字符串常量由双引号包围,代表内存中的一段地址,不可变且占多个字节。构造器(Constructor)是初始化对象的方法,不能被重写(override),但可以重载(overload),即在同一个类中创建多个方法签名不同的构造函数...

    基于Java的SQL工具DialectPaginationUrlParserSqlStatementParserWallFilterBatchExecutorforTest

    WallFilter会检查SQL语句是否包含非法字符或可疑的构造,如双引号、注释、动态拼接等,如果发现潜在的风险,会阻止该SQL执行,确保系统安全。 【BatchExecutor for Test】是用于测试的批量执行器,它可能提供了一种...

    Java程序设计实训实验指导书.doc

    4. **代码排错**:实训中包含了错误代码的识别和修复,例如,正确的字符串输出应使用双引号`"`,而不是单引号`'`,并且方法名首字母需要小写。 5. **变量和数据类型**:在实验二中,学生将学习如何声明和使用变量来...

    词法分析器

    4. **字符串和字符**:在Java中,字符串是由双引号包围的字符序列,而字符由单引号包围。词法分析器需要识别这两者,并正确处理它们的转义字符,如`\n`表示换行,`\t`表示制表符。 5. **数值类型**:包括整数和...

    2021-2022计算机二级等级考试试题及答案No.4710.docx

    字符数组初始化应该使用双引号括起来的字符串,而不是单个字符。 #### 15. 主窗体和子窗体链接 - **知识点**:在数据库应用程序中,主窗体和子窗体之间需要通过共同字段进行链接。 - **解析**:题目中的正确答案是*...

Global site tag (gtag.js) - Google Analytics