字符串分割问题 ,a,"b,c",d,""e,f"",,如果字符串如上,那么如何分割才能获得空a"b,c"d""e,f""空代码这么写,随便什么语言 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 不好写,你最好把"b,c"、""e,f""中间使用别的符号,帮忙顶下,顺便学习学习 坐等csdn你的大侠吧,看看csdn是否真的没落了 for exampleString str = ",a,\"b,c\",d,\"\"e,f\"\",,";String[] sa = str.split("(,(?=(\"|[a-z]+(?=[^\"]))))|,{2,}", -1);for (String s : sa) { System.out.println(s);} public static void main(String[] args) { String str = ",a,\"b,c\",d,\"\"e,f\"\",,"; String arr[] = str.split(",(?=(([^\"]*?\"\"?+[^\"]*?\"\"?+)*[^\"]*$))",-1); for(int i=0;i<arr.length;i++){ System.out.println(i+":"+arr[i]); } } ,a,"b,c",d,,,""e,f"",,如果字符串如上,那么如何分割才能获得空a"b,c"空空""e,f""空 更简单一点的String str = ",a,\"b,c\",d,\"\"e,f\"\",,";String[] sa = str.split(",+(?=(\"|[^\"]+(?=[^\"]))|$)", -1);for (String s : sa) { System.out.println(s);} String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";String[] sa = str.split(",(?=(\"|[^\"]+(?=[^\"]))|,|$)", -1);for (int i=0; i<sa.length; i++) { System.out.printf("%d:%s\n", i+1, sa[i]);}后面多一个空,去掉 |$ 的话,后面多一个逗号,多个逗号在中间和在后面没法单独处理,都是一视同仁的 可以考虑去掉最后多个逗号再分割String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";String[] sa = str.replaceAll(",+$", ",").split(",(?=(\"|[^\"]+(?=[^\"]))|,|$)", -1);for (int i=0; i<sa.length; i++) { System.out.printf("%d:%s\n", i+1, sa[i]);} 其实我这个就是一个csv文件的内容分割,问题就是带引号的列要完整输出(连同引号一起),另外还有一些列是空值,空值也要输出。楼上大侠,没有满足空值输出的要求 考虑到可能有空格的情况String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";String[] sa = str.split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);for (int i=0; i<sa.length; i++) { System.out.printf("%d:%s\n", i+1, sa[i]);} String arr[] = str.split("(^,+)|(,+\"+)|(\"+,+)"); 因为你最后是两个逗号,就意味着最后还有两列空列,如果最后只想要一列空列,那就把最后的两个逗号替换成一个逗号String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";String[] sa = str.replaceAll(",+$", ",").split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);for (int i=0; i<sa.length; i++) { System.out.printf("%d:%s\n", i+1, sa[i]);} public static void main(String[] args) { //str1 = "2,a,"b,c",d,""e,f"",,3,," 如果把开头和结尾改成这样呢? //str2 = ,a,"b,c",d,""e,f"",, String str1 = ",a,\"b,c\",d,\"\"e,f\"\",,"; String str2 = "\",2,a,\"b,l,d,c\",d,\"\"e,f\"\",,4\",,"; String arr[] = str2.split("(^(,|\")*)|(,+\"+)|(\"+,+)|((,+|\"+)$)"); for (String string : arr) { System.out.println(string); } } 你这个也有些问题啊,如果",a,\"b,c\",d,,,\"\"e,f\"\",g"最后的g就没办法被单独分割出来了,结果会是\"\"e,f\"\",g 问题的关键就是要保留引号的,不然我直接用csv来分割了,直接用第三方API了 String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";String[] sa = str.replaceAll(",+$", ",").split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);for (int i=0; i<sa.length; i++) { System.out.printf("%d:%s\n", i+1, sa[i]);} C 语言: char *strtok(char *s, const char *delim);Linux C: strtok_r An example of the output produced by this program is the following: $ ./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/' 1: a/bbb///cc --> a --> bbb --> cc 2: xxx --> xxx 3: yyy --> yyy Program source #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc, char *argv[]) { char *str1, *str2, *token, *subtoken; char *saveptr1, *saveptr2; int j; if (argc != 4) { fprintf(stderr, "Usage: %s string delim subdelim\n", argv[0]); exit(EXIT_FAILURE); } for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) { token = strtok_r(str1, argv[2], &saveptr1); if (token == NULL) break; printf("%d: %s\n", j, token); for (str2 = token; ; str2 = NULL) { subtoken = strtok_r(str2, argv[3], &saveptr2); if (subtoken == NULL) break; printf(" --> %s\n", subtoken); } } exit(EXIT_SUCCESS); } /* main */ C语言:char *strtok(char *s, const char *delim);Linux:char *strtok_r(char *s, const char *delim, char **ptrptr);具体用法百度下~ ([a-z]{0,}[,])|(["]+[a-z]{0,}[,][a-z]{0,}["]+[,]) 附上测试网址:http://www.zhongguosou.com/computer_question_tools/test_regex.aspx Java写的import java.util.Arrays;class StringDemo { public static void main(String[] args) { String str = " ,a,b,c,d,e,f, ,"; String[] st = str.split(","); System.out.println(Arrays.toString(st)); }} 你这个不是CSV格式吧把这行内容保存到文本里,修改后缀为.csv,用 Excel打开,可以看到被分为空格ab,cdef"" 用jar包吧,自己解析太麻烦了,看看opencsvhttp://opencsv.sourceforge.net/ 自定义函数去进行解析如下: public int parseLine(String sLine, String sSplit, List<String> sResult) { String sTmp = ""; String sCopy = ""; int ArrCnt = 0; int iFlag = 0; int iTemp = 0; boolean bFlag = false; sResult.clear(); for (int i = 0; i < sLine.length(); i++) { sCopy = sLine.substring(i, i + 1); if (sCopy.equals("\"")) { if (iTemp + 1 == i) { } else { iTemp = i; bFlag = true; iFlag = iFlag + 1; if (iFlag % 2 == 0) { bFlag = false; iFlag = 0; } } } if (sCopy.equals(sSplit) && !bFlag) { sResult.add(sTmp); ArrCnt = ArrCnt + 1; sTmp = ""; } else if (i == sLine.length() - 1) { sTmp = sTmp + sCopy; sResult.add(sTmp); ArrCnt = ArrCnt + 1; } else { sTmp = sTmp + sCopy; } } return ArrCnt; }*********调用示例: public static void main(String[] args) { int iCol = 0; String s = ",a,\"b,c\",d,\"\"e,f\"\",,"; String sp = ","; List<String> ArrLine = new ArrayList<String>(); parse p = new parse(); iCol = p.parseLine(s, sp, ArrLine); System.out.println("iCol= " + iCol); for (int i = 0; i < iCol; i++){ System.out.println("第"+ i + " 个: " + ArrLine.get(i).toString()); } }*************结果:iCol= 6第0 个: 第1 个: a第2 个: "b,c"第3 个: d第4 个: ""e,f""第5 个: import java.util.regex.*;public class Lpattern{ public static void main(String... args){ //Pattern p=Pattern.compile("$*"); //Matcher m=p.matcher("aaa bbb ccc ddd eee xxx yyy zzz"); //m.find(); //m.matches(); //m.lookingAt(); String s=",a,\"b,c\",d,\"\"e,f\"\",,"; System.out.println("--start--"); System.out.println(s.replaceAll("((?:\"[^\"]*\"|[^\",])*),","$1\r\n")); System.out.println("--end--"); }}---------- 允许Java ------------start--a"b,c"d""ef""--end--输出完成 (耗时 0 秒) - 正常终止 import java.util.regex.*;public class Lpattern{ public static void main(String... args){ //Pattern p=Pattern.compile("$*"); //Matcher m=p.matcher("aaa bbb ccc ddd eee xxx yyy zzz"); //m.find(); //m.matches(); //m.lookingAt(); String s=",a,\"b,c\",d,\"\"e,f\"\",,"; System.out.println("--start--"); System.out.println(s.replaceAll("((?:\"+[^\"]*\"+|[^\",])*),","$1\r\n")); System.out.println("--end--"); }}---------- 允许Java ------------start--a"b,c"d""e,f""--end--输出完成 (耗时 0 秒) - 正常终止 正则表达式专家写的代码,已经优化过了。这个表达式比较复杂,涉及到很多的正则表达式语法,而且优化的程度并不是普通人所能达到的。像这种程序(表达式)建议大家都收藏一下。转引自 Jeffrey E.F.Friedl, Mastering Regular Expressions, 3rd ed., 8.9.1. Parsing Comma-Separated Values (CSV) Text.原文的表达式是采用行内嵌注释模式书写的,这里将其合并了,特此说明一下。import java.util.regex.Pattern;import java.util.regex.Matcher;public class Test { public static void main(String[] args) { String str = "dw,\"kk,ll\",\",yioi\",iu,\",\",r3,\"\"\"fte\",l,\"kk\"\"ll\",mm'oo,\"n\"\"dw,erw\"\",e\",, "; String regex = "\\G(?:^|,)(?:\"([^\"]*+(?:\"\"[^\"]*+)*+)\"|([^\",]*+))"; Matcher main = Pattern.compile(regex).matcher(str); Matcher mquote = Pattern.compile("\"\"").matcher(""); while (main.find()) { String field; if (main.start(2) >= 0) { field = main.group(2); } else { field = mquote.reset(main.group(1)).replaceAll("\""); } System.out.println("Field [" + field + "]"); } System.out.println("dw kk,ll ,yioi iu , r3 \"fte l kk\"ll mm'oo n\"dw,erw\",e"); }} public static void main(String[] args) { // TODO Auto-generated method stub String str=",a,\"b,c\",d,,,\"\"e,f\"\",,"; int k=0; int count=1; //计数 for(int i=0;i<str.length();){ char ch=str.charAt(i); if(ch=='\"'){ if (k!=i) { //判断f"",类型 String strOut=str.substring(k, i); System.out.println("第"+count+"个:"+strOut); k=i; i++; count++; } else { i++; } int index=str.indexOf('\"', i); //处理"ed"类型 String strOut=str.substring(k, index+1); System.out.println("第"+count+"个:"+strOut); count++; i=index+1; k=index+1; } else if (ch==',') { String strOut=str.substring(k, i); if(strOut.length()!=0) { System.out.println("第"+count+"个:"+strOut); count++; } k=i+1; i++; } else { if(i==str.length()-1) //对结尾进行判断 { String strOut=str.substring(k, i); if(strOut.length()!=0) { System.out.println("第"+count+"个:"+strOut); count++; } } i++; } } }第1个:a第2个:"b,c"第3个:d第4个:""第5个:e第6个:f第7个:"" public static void main(String[] args) { // TODO Auto-generated method stub String str=",a,\"b,c\",d,,,\"\"e,f\"\",,"; int k=0; int count=1; //计数 for(int i=0;i<str.length();){ char ch=str.charAt(i); if(ch=='\"'){ if (k!=i) { //判断f"",类型 String strOut=str.substring(k, i); System.out.println("第"+count+"个:"+strOut); k=i; i++; count++; } else { i++; } int index=str.indexOf('\"', i); //处理"ed"类型 String strOut=str.substring(k, index+1); System.out.println("第"+count+"个:"+strOut); count++; i=index+1; k=index+1; } else if (ch==',') { String strOut=str.substring(k, i); if(strOut.length()!=0) { System.out.println("第"+count+"个:"+strOut); count++; } k=i+1; i++; } else { if(i==str.length()-1) //对结尾进行判断 { String strOut=str.substring(k, i); if(strOut.length()!=0) { System.out.println("第"+count+"个:"+strOut); count++; } } i++; } } }第1个:a第2个:"b,c"第3个:d第4个:""第5个:e第6个:f第7个:"" String str = ",a,\"b,c\",d,\"\"e,f\"\",,";String[] sa = str.split("(,(?=(\"|[a-z]+(?=[^\"]))))|,{2,}", -1);for (String s : sa) { System.out.println(s);} #include <boost/config/warning_disable.hpp>#include <boost/spirit/include/qi.hpp>#include <boost/spirit/include/phoenix_core.hpp>#include <boost/spirit/include/phoenix_operator.hpp>#include <boost/spirit/include/phoenix_stl.hpp>#include <string>#include <iostream>#include <list>using namespace boost::spirit::qi;using namespace boost::phoenix;void test(std::string const& strTest,std::list<std::string> &outList){ typedef rule<std::string::const_iterator> rule_t; rule_t r1=as<std::string>()[*space>>"\"">>*(char_-'"')>>"\"">>*space][push_back(boost::phoenix::ref(outList),_1)]; rule_t r2=as<std::string>()[*space>>*(char_-',')>>*space ][push_back(boost::phoenix::ref(outList),_1)]; std::string::const_iterator iter1=strTest.begin(); std::string::const_iterator iter2=strTest.end(); if(parse(iter1,iter2,(r1|r2)%"," ) && iter1==iter2) { std::cout<<"-----ok-----\n"; }}int _tmain(int argc, _TCHAR* argv[]){ std::list<std::string> resList; std::string strTest="abc, \"d,e,f\" ,,\"12,3\", 456 , , , ,\"7\" ,8, blank ,9,10"; test(strTest,resList); for (std::list<std::string>::const_iterator iter=resList.begin();iter!=resList.end();iter++) { std::cout<<*iter<<std::endl; } return 0;} 核心代码就几句:typedef rule<std::string::const_iterator> rule_t; rule_t r1=as<std::string>()[*space>>"\"">>*(char_-'"')>>"\"">>*space][push_back(boost::phoenix::ref(outList),_1)]; rule_t r2=as<std::string>()[*space>>*(char_-',')>>*space ][push_back(boost::phoenix::ref(outList),_1)]; std::string::const_iterator iter1=strTest.begin(); std::string::const_iterator iter2=strTest.end(); if(parse(iter1,iter2,(r1|r2)%"," ) && iter1==iter2) { std::cout<<"-----ok-----\n"; } 再次精简:std::string strTest="abc, \"d,e,f\" ,,\"12,3\", 456 , , , ,\"7\" ,8, blank ,9,10";rule_t r1=*space>>"\"">>*(char_-'"')>>"\"">>*space;rule_t r2=*space>>*(char_-',')>>*space ;std::string::const_iterator iter1=strTest.begin();std::string::const_iterator iter2=strTest.end();if(parse(iter1,iter2,(r1|r2)%"," ) && iter1==iter2){ std::cout<<"-----ok-----\n";} 如何让swing中的对象实现双重监听器! 拜师学艺JAVA! 缓冲区大小如何确定 关于Runtime.getRuntime().exec的问题 父类和子类有一样的方法,如果要调用,会调用哪一个啊 有点奇怪 200分,200分,不是很难的jni问题啊!但我困惑中……………………… 不理解!!! 【讨论】面向接口编程,分不多,但是绝对干货 新手请教!j2sdk 的开发环境怎么进去?难道它就用计事本写代码吗? 求助如何在一个activity动态加载另外的activity类 socket 客户端接受不到数据
String str = ",a,\"b,c\",d,\"\"e,f\"\",,";
String[] sa = str.split("(,(?=(\"|[a-z]+(?=[^\"]))))|,{2,}", -1);
for (String s : sa) {
System.out.println(s);
}
public static void main(String[] args) {
String str = ",a,\"b,c\",d,\"\"e,f\"\",,";
String arr[] = str.split(",(?=(([^\"]*?\"\"?+[^\"]*?\"\"?+)*[^\"]*$))",-1);
for(int i=0;i<arr.length;i++){
System.out.println(i+":"+arr[i]);
}
}
如果字符串如上,那么如何分割才能获得
空
a
"b,c"
空
空
""e,f""
空
String str = ",a,\"b,c\",d,\"\"e,f\"\",,";
String[] sa = str.split(",+(?=(\"|[^\"]+(?=[^\"]))|$)", -1);
for (String s : sa) {
System.out.println(s);
}
String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";
String[] sa = str.split(",(?=(\"|[^\"]+(?=[^\"]))|,|$)", -1);
for (int i=0; i<sa.length; i++) {
System.out.printf("%d:%s\n", i+1, sa[i]);
}后面多一个空,去掉 |$ 的话,后面多一个逗号,多个逗号在中间和在后面没法单独处理,都是一视同仁的
String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";
String[] sa = str.replaceAll(",+$", ",").split(",(?=(\"|[^\"]+(?=[^\"]))|,|$)", -1);
for (int i=0; i<sa.length; i++) {
System.out.printf("%d:%s\n", i+1, sa[i]);
}
String[] sa = str.split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);
for (int i=0; i<sa.length; i++) {
System.out.printf("%d:%s\n", i+1, sa[i]);
}
String arr[] = str.split("(^,+)|(,+\"+)|(\"+,+)");
String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";
String[] sa = str.replaceAll(",+$", ",").split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);
for (int i=0; i<sa.length; i++) {
System.out.printf("%d:%s\n", i+1, sa[i]);
}
public static void main(String[] args) {
//str1 = "2,a,"b,c",d,""e,f"",,3,," 如果把开头和结尾改成这样呢?
//str2 = ,a,"b,c",d,""e,f"",,
String str1 = ",a,\"b,c\",d,\"\"e,f\"\",,";
String str2 = "\",2,a,\"b,l,d,c\",d,\"\"e,f\"\",,4\",,";
String arr[] = str2.split("(^(,|\")*)|(,+\"+)|(\"+,+)|((,+|\"+)$)");
for (String string : arr) {
System.out.println(string);
}
}
String[] sa = str.replaceAll(",+$", ",").split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);
for (int i=0; i<sa.length; i++) {
System.out.printf("%d:%s\n", i+1, sa[i]);
}
Linux C: strtok_r An example of the output produced by this program is the following: $ ./a.out 'a/bbb///cc;xxx:yyy:' ':;' '/'
1: a/bbb///cc
--> a
--> bbb
--> cc
2: xxx
--> xxx
3: yyy
--> yyy Program source #include <stdio.h>
#include <stdlib.h>
#include <string.h> int
main(int argc, char *argv[])
{
char *str1, *str2, *token, *subtoken;
char *saveptr1, *saveptr2;
int j; if (argc != 4) {
fprintf(stderr, "Usage: %s string delim subdelim\n",
argv[0]);
exit(EXIT_FAILURE);
} for (j = 1, str1 = argv[1]; ; j++, str1 = NULL) {
token = strtok_r(str1, argv[2], &saveptr1);
if (token == NULL)
break;
printf("%d: %s\n", j, token); for (str2 = token; ; str2 = NULL) {
subtoken = strtok_r(str2, argv[3], &saveptr2);
if (subtoken == NULL)
break;
printf(" --> %s\n", subtoken);
}
} exit(EXIT_SUCCESS);
} /* main */
Linux:char *strtok_r(char *s, const char *delim, char **ptrptr);具体用法百度下~
http://www.zhongguosou.com/computer_question_tools/test_regex.aspx
import java.util.Arrays;class StringDemo
{
public static void main(String[] args)
{
String str = " ,a,b,c,d,e,f, ,";
String[] st = str.split(",");
System.out.println(Arrays.toString(st));
}
}
把这行内容保存到文本里,修改后缀为.csv,用 Excel打开,可以看到
被分为空格
a
b,c
d
e
f""
http://opencsv.sourceforge.net/
如下:
public int parseLine(String sLine, String sSplit, List<String> sResult) {
String sTmp = "";
String sCopy = "";
int ArrCnt = 0;
int iFlag = 0;
int iTemp = 0;
boolean bFlag = false;
sResult.clear();
for (int i = 0; i < sLine.length(); i++) {
sCopy = sLine.substring(i, i + 1);
if (sCopy.equals("\"")) {
if (iTemp + 1 == i) { } else {
iTemp = i;
bFlag = true;
iFlag = iFlag + 1;
if (iFlag % 2 == 0) {
bFlag = false;
iFlag = 0;
}
}
}
if (sCopy.equals(sSplit) && !bFlag) {
sResult.add(sTmp);
ArrCnt = ArrCnt + 1;
sTmp = "";
} else if (i == sLine.length() - 1) {
sTmp = sTmp + sCopy;
sResult.add(sTmp);
ArrCnt = ArrCnt + 1;
} else {
sTmp = sTmp + sCopy;
}
}
return ArrCnt;
}*********
调用示例:
public static void main(String[] args) {
int iCol = 0;
String s = ",a,\"b,c\",d,\"\"e,f\"\",,";
String sp = ",";
List<String> ArrLine = new ArrayList<String>();
parse p = new parse();
iCol = p.parseLine(s, sp, ArrLine);
System.out.println("iCol= " + iCol);
for (int i = 0; i < iCol; i++){
System.out.println("第"+ i + " 个: " + ArrLine.get(i).toString());
}
}*************
结果:
iCol= 6
第0 个:
第1 个: a
第2 个: "b,c"
第3 个: d
第4 个: ""e,f""
第5 个:
import java.util.regex.*;public class Lpattern
{
public static void main(String... args){
//Pattern p=Pattern.compile("$*");
//Matcher m=p.matcher("aaa bbb ccc ddd eee xxx yyy zzz");
//m.find();
//m.matches();
//m.lookingAt();
String s=",a,\"b,c\",d,\"\"e,f\"\",,";
System.out.println("--start--");
System.out.println(s.replaceAll("((?:\"[^\"]*\"|[^\",])*),","$1\r\n"));
System.out.println("--end--");
}
}---------- 允许Java ----------
--start--a
"b,c"
d
""e
f""
--end--输出完成 (耗时 0 秒) - 正常终止
import java.util.regex.*;public class Lpattern
{
public static void main(String... args){
//Pattern p=Pattern.compile("$*");
//Matcher m=p.matcher("aaa bbb ccc ddd eee xxx yyy zzz");
//m.find();
//m.matches();
//m.lookingAt();
String s=",a,\"b,c\",d,\"\"e,f\"\",,";
System.out.println("--start--");
System.out.println(s.replaceAll("((?:\"+[^\"]*\"+|[^\",])*),","$1\r\n"));
System.out.println("--end--");
}
}
---------- 允许Java ----------
--start--a
"b,c"
d
""e,f""
--end--输出完成 (耗时 0 秒) - 正常终止
像这种程序(表达式)建议大家都收藏一下。转引自 Jeffrey E.F.Friedl, Mastering Regular Expressions, 3rd ed., 8.9.1. Parsing Comma-Separated Values (CSV) Text.原文的表达式是采用行内嵌注释模式书写的,这里将其合并了,特此说明一下。import java.util.regex.Pattern;
import java.util.regex.Matcher;public class Test {
public static void main(String[] args) {
String str = "dw,\"kk,ll\",\",yioi\",iu,\",\",r3,\"\"\"fte\",l,\"kk\"\"ll\",mm'oo,\"n\"\"dw,erw\"\",e\",, ";
String regex = "\\G(?:^|,)(?:\"([^\"]*+(?:\"\"[^\"]*+)*+)\"|([^\",]*+))";
Matcher main = Pattern.compile(regex).matcher(str);
Matcher mquote = Pattern.compile("\"\"").matcher("");
while (main.find()) {
String field;
if (main.start(2) >= 0) {
field = main.group(2);
} else {
field = mquote.reset(main.group(1)).replaceAll("\"");
}
System.out.println("Field [" + field + "]");
}
System.out.println("dw kk,ll ,yioi iu , r3 \"fte l kk\"ll mm'oo n\"dw,erw\",e");
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String str=",a,\"b,c\",d,,,\"\"e,f\"\",,";
int k=0;
int count=1; //计数
for(int i=0;i<str.length();){
char ch=str.charAt(i);
if(ch=='\"'){
if (k!=i) { //判断f"",类型
String strOut=str.substring(k, i);
System.out.println("第"+count+"个:"+strOut);
k=i;
i++;
count++;
}
else {
i++;
}
int index=str.indexOf('\"', i); //处理"ed"类型
String strOut=str.substring(k, index+1);
System.out.println("第"+count+"个:"+strOut);
count++;
i=index+1;
k=index+1;
}
else if (ch==',') {
String strOut=str.substring(k, i);
if(strOut.length()!=0)
{
System.out.println("第"+count+"个:"+strOut);
count++;
}
k=i+1;
i++;
}
else {
if(i==str.length()-1) //对结尾进行判断
{
String strOut=str.substring(k, i);
if(strOut.length()!=0)
{
System.out.println("第"+count+"个:"+strOut);
count++;
}
}
i++;
} } }第1个:a
第2个:"b,c"
第3个:d
第4个:""
第5个:e
第6个:f
第7个:""
public static void main(String[] args) {
// TODO Auto-generated method stub
String str=",a,\"b,c\",d,,,\"\"e,f\"\",,";
int k=0;
int count=1; //计数
for(int i=0;i<str.length();){
char ch=str.charAt(i);
if(ch=='\"'){
if (k!=i) { //判断f"",类型
String strOut=str.substring(k, i);
System.out.println("第"+count+"个:"+strOut);
k=i;
i++;
count++;
}
else {
i++;
}
int index=str.indexOf('\"', i); //处理"ed"类型
String strOut=str.substring(k, index+1);
System.out.println("第"+count+"个:"+strOut);
count++;
i=index+1;
k=index+1;
}
else if (ch==',') {
String strOut=str.substring(k, i);
if(strOut.length()!=0)
{
System.out.println("第"+count+"个:"+strOut);
count++;
}
k=i+1;
i++;
}
else {
if(i==str.length()-1) //对结尾进行判断
{
String strOut=str.substring(k, i);
if(strOut.length()!=0)
{
System.out.println("第"+count+"个:"+strOut);
count++;
}
}
i++;
} } }
第1个:a
第2个:"b,c"
第3个:d
第4个:""
第5个:e
第6个:f
第7个:""
String[] sa = str.split("(,(?=(\"|[a-z]+(?=[^\"]))))|,{2,}", -1);
for (String s : sa) {
System.out.println(s);
}
#include <boost/config/warning_disable.hpp>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix_core.hpp>
#include <boost/spirit/include/phoenix_operator.hpp>
#include <boost/spirit/include/phoenix_stl.hpp>#include <string>
#include <iostream>
#include <list>using namespace boost::spirit::qi;
using namespace boost::phoenix;void test(std::string const& strTest,std::list<std::string> &outList)
{
typedef rule<std::string::const_iterator> rule_t;
rule_t r1=as<std::string>()[*space>>"\"">>*(char_-'"')>>"\"">>*space][push_back(boost::phoenix::ref(outList),_1)];
rule_t r2=as<std::string>()[*space>>*(char_-',')>>*space ][push_back(boost::phoenix::ref(outList),_1)];
std::string::const_iterator iter1=strTest.begin();
std::string::const_iterator iter2=strTest.end(); if(parse(iter1,iter2,(r1|r2)%"," ) && iter1==iter2)
{
std::cout<<"-----ok-----\n";
}
}
int _tmain(int argc, _TCHAR* argv[])
{
std::list<std::string> resList;
std::string strTest="abc, \"d,e,f\" ,,\"12,3\", 456 , , , ,\"7\" ,8, blank ,9,10";
test(strTest,resList);
for (std::list<std::string>::const_iterator iter=resList.begin();iter!=resList.end();iter++)
{
std::cout<<*iter<<std::endl;
}
return 0;
}
typedef rule<std::string::const_iterator> rule_t;
rule_t r1=as<std::string>()[*space>>"\"">>*(char_-'"')>>"\"">>*space][push_back(boost::phoenix::ref(outList),_1)];
rule_t r2=as<std::string>()[*space>>*(char_-',')>>*space ][push_back(boost::phoenix::ref(outList),_1)];
std::string::const_iterator iter1=strTest.begin();
std::string::const_iterator iter2=strTest.end(); if(parse(iter1,iter2,(r1|r2)%"," ) && iter1==iter2)
{
std::cout<<"-----ok-----\n";
}
rule_t r2=*space>>*(char_-',')>>*space ;std::string::const_iterator iter1=strTest.begin();
std::string::const_iterator iter2=strTest.end();if(parse(iter1,iter2,(r1|r2)%"," ) && iter1==iter2)
{
std::cout<<"-----ok-----\n";
}