这种 是一个完善的解决办法
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中,字符串是类`String`的对象,因此在词法分析时,需要识别出以双引号开始和结束的字符序列,并将其转换为对应的`String`对象。这个过程中,词法分析器还需要处理转义字符,如"\n"表示换行,"\t"表示制表符。...
- **字符串**:由双引号括起来的一系列字符构成,例如 `"Hello World!"`。在Java中,字符串不是基本类型,而是作为一个不可变的对象,即 `String` 类的一个实例来处理。 ##### 2. `String` 类及其构造函数 - **...
字符串可以使用双引号或单引号括起来。字符串可以进行连接、截取、比较等操作。 在实验中,学生需要编写一个 Java Applet 程序,接受用户输入的一个文件名,然后截取其后缀,根据其后缀判断文件的类型。 通过完成...
4. **字符串(String)**:用双引号包围的字符序列,如"Hello, World!"。 5. **符号(Punctuation)**:包括各种界符,如分号`;`、逗号`,`、括号`()`、`[]`、`{}`等。 6. **操作符(Operator)**:如`+`、`-`、`*`...
", ",", "(", ")", "{", "}", 和双引号(")"用于分隔和标记代码的不同部分。在Java实现中,它们被定义为一个字符数组`bounder`。 3. **文件读取**:为了处理输入的C语言源代码,实验使用了`FileReader`和`...
字符串字面量是用双引号包围的字符序列,如"Hello, world!"。转义序列如`\n`表示换行,`\t`表示制表符,它们允许在字符串中插入特殊字符。 6. 静态方法与过程性分解 静态方法属于类而不是类的实例,可以不创建...
3. **字符串处理**:脚本语言通常需要支持字符串字面量,包括单引号和双引号字符串。解析器需要识别字符串的开始和结束,并处理转义字符。在处理字符串时,还要考虑到字符串连接操作,例如两个相邻的字符串字面量在...
例如,如何高效地处理长字符串,如何优化错误报告以提高用户体验,以及如何通过单元测试确保分析器的准确性。 总之,"Java 实现词法分析器"是一个涵盖了编译原理基础的项目,它不仅涉及到Java编程,还涉及到形式...
字符串是由双引号包围的字符序列。 理解这些基础知识对于学习和掌握Java编程至关重要。通过深入学习,可以进一步了解如何创建变量、进行运算、控制流程、处理异常以及实现面向对象的编程概念。熟练掌握Java语言基础...
- 值:可以是字符串(双引号包围),数字,布尔值(true/false),null,对象或数组。 2. JSON解析的两种常见方式: - 手动解析:通过字符串操作,如JavaScript中的split()、substring()等方法,或者正则表达式,...
- **字符串文字**:由双引号括起来的一系列字符。 - **转义序列**:例如`\n`代表换行符。 - **空文字**:`null`关键字表示没有值的对象引用。 - **分隔符**:列举了用于分隔不同元素的符号。 - **运算符**:介绍...
数值常量可以是十进制、八进制或十六进制,字符串常量则用双引号括起来。 4. 运算符:如加减乘除、赋值、比较、逻辑等运算符,以及特殊的位运算符。 5. 分隔符:包括括号、逗号、分号等,它们在源代码中起着分隔和...
6. **字符串**:在Java中,字符串是一个字符序列,通常用双引号包围,如`"Hello, World!"`。它们是对象,属于`String`类。 7. **注释**:Java支持单行注释(//)、多行注释(/* ... */)和文档注释(/** ... */),...
字符串常量由双引号包围,代表内存中的一段地址,不可变且占多个字节。构造器(Constructor)是初始化对象的方法,不能被重写(override),但可以重载(overload),即在同一个类中创建多个方法签名不同的构造函数...
WallFilter会检查SQL语句是否包含非法字符或可疑的构造,如双引号、注释、动态拼接等,如果发现潜在的风险,会阻止该SQL执行,确保系统安全。 【BatchExecutor for Test】是用于测试的批量执行器,它可能提供了一种...
4. **代码排错**:实训中包含了错误代码的识别和修复,例如,正确的字符串输出应使用双引号`"`,而不是单引号`'`,并且方法名首字母需要小写。 5. **变量和数据类型**:在实验二中,学生将学习如何声明和使用变量来...
4. **字符串和字符**:在Java中,字符串是由双引号包围的字符序列,而字符由单引号包围。词法分析器需要识别这两者,并正确处理它们的转义字符,如`\n`表示换行,`\t`表示制表符。 5. **数值类型**:包括整数和...
字符数组初始化应该使用双引号括起来的字符串,而不是单个字符。 #### 15. 主窗体和子窗体链接 - **知识点**:在数据库应用程序中,主窗体和子窗体之间需要通过共同字段进行链接。 - **解析**:题目中的正确答案是*...