字符串分割问题
,a,"b,c",d,""e,f"",,如果字符串如上,那么如何分割才能获得
空
a
"b,c"
d
""e,f""
空
代码这么写,随便什么语言 --------------------编程问答-------------------- 不好写,你最好把"b,c"、""e,f""中间使用别的符号,帮忙顶下,顺便学习学习 --------------------编程问答-------------------- 我也知道不好写啊,但是格式就是这样的,要考虑的场景就是这样
不知道正则能否解决 --------------------编程问答-------------------- 的确不是很好写的哈 什么要考虑到的 --------------------编程问答-------------------- 坐等csdn你的大侠吧,看看csdn是否真的没落了。。。 --------------------编程问答-------------------- 用引号分开? --------------------编程问答-------------------- 用逗号分开的,引号也是字符串的内容 --------------------编程问答-------------------- 手动判断吧 --------------------编程问答-------------------- 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);
}
--------------------编程问答-------------------- ,a,"b,c",d,,,""e,f"",,
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""
空 --------------------编程问答-------------------- 最好是ruby语言的code
--------------------编程问答-------------------- 更简单一点的
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\"\",,";--------------------编程问答-------------------- 其实我这个就是一个csv文件的内容分割,问题就是带引号的列要完整输出(连同引号一起),另外还有一些列是空值,空值也要输出。楼上大侠,没有满足空值输出的要求 --------------------编程问答--------------------
String[] sa = str.replaceAll(",+$", ",").split(",(?=(\"|[^\"]+(?=[^\"]))|,|$)", -1);
for (int i=0; i<sa.length; i++) {
System.out.printf("%d:%s\n", i+1, sa[i]);
}
如果是按你这么说的话,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]);
}
基本正确了,但是就是最后为什么会多出一个空格来了呢? --------------------编程问答--------------------
--------------------编程问答--------------------
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]);
}
--------------------编程问答-------------------- 你这个有严重问题,分割后,引号都没有了 --------------------编程问答-------------------- 各位高手, 学习了 --------------------编程问答-------------------- 你这个也有些问题啊,如果",a,\"b,c\",d,,,\"\"e,f\"\",g"最后的g就没办法被单独分割出来了,结果会是\"\"e,f\"\",g --------------------编程问答--------------------
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);
}
}
还要有引号吗? --------------------编程问答-------------------- 问题的关键就是要保留引号的,不然我直接用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");
}
}
火龙果 兄弟是我目前见到的最专业,最热心的 //注:没有之一 --------------------编程问答-------------------- --------------------编程问答-------------------- --------------------编程问答--------------------
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\"\",,";
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";
}
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