,a,"b,c",d,""e,f"",,
如果字符串如上,那么如何分割才能获得

a
"b,c"
d
""e,f""

代码这么写,随便什么语言

解决方案 »

  1.   

    不好写,你最好把"b,c"、""e,f""中间使用别的符号,帮忙顶下,顺便学习学习
      

  2.   

    坐等csdn你的大侠吧,看看csdn是否真的没落了
      

  3.   

    for example
    String str = ",a,\"b,c\",d,\"\"e,f\"\",,";
    String[] sa = str.split("(,(?=(\"|[a-z]+(?=[^\"]))))|,{2,}", -1);
    for (String s : sa) {
        System.out.println(s);
    }
      

  4.   


    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]);
    }
    }
      

  5.   

    ,a,"b,c",d,,,""e,f"",,
    如果字符串如上,那么如何分割才能获得

    a
    "b,c"


    ""e,f""
      

  6.   

    更简单一点的
    String str = ",a,\"b,c\",d,\"\"e,f\"\",,";
    String[] sa = str.split(",+(?=(\"|[^\"]+(?=[^\"]))|$)", -1);
    for (String s : sa) {
        System.out.println(s);
    }
      

  7.   


    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]);
    }后面多一个空,去掉 |$ 的话,后面多一个逗号,多个逗号在中间和在后面没法单独处理,都是一视同仁的
      

  8.   

    可以考虑去掉最后多个逗号再分割
    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]);
    }
      

  9.   

    其实我这个就是一个csv文件的内容分割,问题就是带引号的列要完整输出(连同引号一起),另外还有一些列是空值,空值也要输出。楼上大侠,没有满足空值输出的要求
      

  10.   

    考虑到可能有空格的情况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]);
    }
      

  11.   


    String arr[] = str.split("(^,+)|(,+\"+)|(\"+,+)");
      

  12.   

    因为你最后是两个逗号,就意味着最后还有两列空列,如果最后只想要一列空列,那就把最后的两个逗号替换成一个逗号
    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]);
    }
      

  13.   


    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);
    }
    }
      

  14.   

    你这个也有些问题啊,如果",a,\"b,c\",d,,,\"\"e,f\"\",g"最后的g就没办法被单独分割出来了,结果会是\"\"e,f\"\",g
      

  15.   

    问题的关键就是要保留引号的,不然我直接用csv来分割了,直接用第三方API了
      

  16.   

    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]);
    }
      

  17.   

    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 */
      

  18.   

    C语言:char *strtok(char *s, const char *delim);
    Linux:char *strtok_r(char *s, const char *delim, char **ptrptr);具体用法百度下~
      

  19.   

    ([a-z]{0,}[,])|(["]+[a-z]{0,}[,][a-z]{0,}["]+[,])
      

  20.   

    附上测试网址:
    http://www.zhongguosou.com/computer_question_tools/test_regex.aspx
      

  21.   

    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));
    }
    }
      

  22.   

    你这个不是CSV格式吧
    把这行内容保存到文本里,修改后缀为.csv,用 Excel打开,可以看到
    被分为空格
    a
    b,c
    d
    e
    f""
      

  23.   

    用jar包吧,自己解析太麻烦了,看看opencsv
    http://opencsv.sourceforge.net/
      

  24.   

    自定义函数去进行解析
    如下:
    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 个:  
      

  25.   


    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 秒) - 正常终止
      

  26.   


    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 秒) - 正常终止
      

  27.   

    正则表达式专家写的代码,已经优化过了。这个表达式比较复杂,涉及到很多的正则表达式语法,而且优化的程度并不是普通人所能达到的。
    像这种程序(表达式)建议大家都收藏一下。转引自 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");
        }
    }
      

  28.   


    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个:""
      

  29.   


    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个:""
      

  30.   

    String str = ",a,\"b,c\",d,\"\"e,f\"\",,";
    String[] sa = str.split("(,(?=(\"|[a-z]+(?=[^\"]))))|,{2,}", -1);
    for (String s : sa) {
        System.out.println(s);
    }
      

  31.   


    #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;
    }
      

  32.   

    核心代码就几句:
    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";
    }
      

  33.   

    再次精简: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";
    }