当前位置:编程学习 > JAVA >>

字符串分割问题

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

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

代码这么写,随便什么语言 --------------------编程问答-------------------- 不好写,你最好把"b,c"、""e,f""中间使用别的符号,帮忙顶下,顺便学习学习 --------------------编程问答-------------------- 我也知道不好写啊,但是格式就是这样的,要考虑的场景就是这样
不知道正则能否解决 --------------------编程问答-------------------- 的确不是很好写的哈 什么要考虑到的 --------------------编程问答-------------------- 坐等csdn你的大侠吧,看看csdn是否真的没落了。。。 --------------------编程问答-------------------- 用引号分开? --------------------编程问答--------------------
引用 5 楼 jlu_lamp_lamp 的回复:
用引号分开?
用逗号分开的,引号也是字符串的内容 --------------------编程问答-------------------- 手动判断吧 --------------------编程问答-------------------- 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);
}
--------------------编程问答--------------------

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""
空 --------------------编程问答-------------------- 最好是ruby语言的code
--------------------编程问答-------------------- 更简单一点的
String str = ",a,\"b,c\",d,\"\"e,f\"\",,";
String[] sa = str.split(",+(?=(\"|[^\"]+(?=[^\"]))|$)", -1);
for (String s : sa) {
    System.out.println(s);
}
--------------------编程问答--------------------
引用 10 楼  的回复:
,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 (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文件的内容分割,问题就是带引号的列要完整输出(连同引号一起),另外还有一些列是空值,空值也要输出。楼上大侠,没有满足空值输出的要求 --------------------编程问答--------------------
引用 15 楼  的回复:
其实我这个就是一个csv文件的内容分割,问题就是带引号的列要完整输出(连同引号一起),另外还有一些列是空值,空值也要输出。楼上大侠,没有满足空值输出的要求

如果是按你这么说的话,13L的不行吗?后面多个逗号就是保持多个列输出,我还以为后面多个逗号只输出一列
--------------------编程问答-------------------- 考虑到可能有空格的情况

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]);
}
--------------------编程问答--------------------
引用 17 楼  的回复:
考虑到可能有空格的情况

Java code
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.print……

基本正确了,但是就是最后为什么会多出一个空格来了呢? --------------------编程问答--------------------

String arr[] = str.split("(^,+)|(,+\"+)|(\"+,+)");
--------------------编程问答--------------------
引用 18 楼  的回复:
引用 17 楼 的回复:

考虑到可能有空格的情况

Java code
String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";
String[] sa = str.split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);
for (int i=0; i<sa.length; i++) {
Sy……

因为你最后是两个逗号,就意味着最后还有两列空列,如果最后只想要一列空列,那就把最后的两个逗号替换成一个逗号
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);
}
}
--------------------编程问答--------------------
引用 21 楼  的回复:
Java code

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,\"……
你这个有严重问题,分割后,引号都没有了 --------------------编程问答-------------------- 各位高手, 学习了 --------------------编程问答--------------------
引用 20 楼  的回复:
引用 18 楼  的回复:
引用 17 楼 的回复:

考虑到可能有空格的情况

Java code
String str = ",a,\"b,c\",d,,,\"\"e,f\"\",,";
String[] sa = str.split(",(?=(\\s*\"|[^\"]+(?=[^\"]))|\\s*,|\\s*$)", -1);
for (int i=0; i<sa.le……
你这个也有些问题啊,如果",a,\"b,c\",d,,,\"\"e,f\"\",g"最后的g就没办法被单独分割出来了,结果会是\"\"e,f\"\",g --------------------编程问答--------------------
引用 22 楼  的回复:
引用 21 楼  的回复:

Java code

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,\"……
……


还要有引号吗?  --------------------编程问答--------------------
引用 25 楼  的回复:
引用 22 楼  的回复:

引用 21 楼  的回复:

Java code

public static void main(String[] args) {
//str1 =   "2,a,"b,c",d,""e,f"",,3,,"        如果把开头和结尾改成这样呢?
//str2 =   ,a,"b,c",d,""e,f"",,
String str1 = ",……
问题的关键就是要保留引号的,不然我直接用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 --------------------编程问答-------------------- 没什么规律的东西,就指定取多少次,每次去多少位,可以指定取0位,就是空。 --------------------编程问答-------------------- 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打开,可以看到
被分为

空格
a
b,c
d
e
f"" --------------------编程问答-------------------- 用jar包吧,自己解析太麻烦了,看看opencsv
http://opencsv.sourceforge.net/ --------------------编程问答-------------------- 学习了,csdn程序员的天堂。 --------------------编程问答-------------------- 自定义函数去进行解析
如下:
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");
    }
}
--------------------编程问答--------------------
引用 46 楼  的回复:
正则表达式专家写的代码,已经优化过了。

这个表达式比较复杂,涉及到很多的正则表达式语法,而且优化的程度并不是普通人所能达到的。
像这种程序(表达式)建议大家都收藏一下。

转引自 Jeffrey E.F.Friedl, Mastering Regular Expressions, 3rd ed., 8.9.1. Parsing Comma-Separated Values (CSV)……


火龙果 兄弟是我目前见到的最专业,最热心的 //注:没有之一 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------

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";
}
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,