刚才那贴看大家都很热情,可惜60分太少,所以就结了下,有兴趣的来这边讨论好了。之前也有些规则没写明白,重新补充下:规则如下:1、已知一字符串数组,这些字符串有以下特点:
a、字符串由随机数字或字母以及引号和逗号组成
b、如果字符串中含有逗号,则字符串 头尾一定有引号
c、如果字符串中没有逗号,则字符串 头尾可能有引号,也可能没有引号
d、引号会且仅会出现在字符串的头尾,不会出现在中间位置如:[1] ["123"] ["12,33"] [7a] ["s1,c4,t7s"] [ccc] ["ss"] ----每一个[]内表示一个字符串
现在把所有字符串用逗号连起来。
1,"123","12,33",7a,"s1,c4,t7s",ccc,"ss" 求将连接后的字符串 拆分回原字符串数组。
注:
1、原题是直接拆字符串成数组,我只是总结出被拆出来的字符串的规律,所以不用建议我换其他连接符连接啦
2、与之前题相比就是不用拆完后去掉引号了,因为拆成数组后去引号太容易了=.=
有兴趣的继续跟帖吧。我悲剧的想用正则省代码,被老大说了,不要用正则,万一出问题了其他人怎么维护,而且效率也不高。
好吧我老老实实遍历了....
a、字符串由随机数字或字母以及引号和逗号组成
b、如果字符串中含有逗号,则字符串 头尾一定有引号
c、如果字符串中没有逗号,则字符串 头尾可能有引号,也可能没有引号
d、引号会且仅会出现在字符串的头尾,不会出现在中间位置如:[1] ["123"] ["12,33"] [7a] ["s1,c4,t7s"] [ccc] ["ss"] ----每一个[]内表示一个字符串
现在把所有字符串用逗号连起来。
1,"123","12,33",7a,"s1,c4,t7s",ccc,"ss" 求将连接后的字符串 拆分回原字符串数组。
注:
1、原题是直接拆字符串成数组,我只是总结出被拆出来的字符串的规律,所以不用建议我换其他连接符连接啦
2、与之前题相比就是不用拆完后去掉引号了,因为拆成数组后去引号太容易了=.=
有兴趣的继续跟帖吧。我悲剧的想用正则省代码,被老大说了,不要用正则,万一出问题了其他人怎么维护,而且效率也不高。
好吧我老老实实遍历了....
split两次,第一次用" 第二次用,
第一次split的结果中,只有下标除以2不尽的才是""内部的,不需要进行第二次split
String[] ss1 = str.split("\"");
for (int i=0; i<ss1.length; i++) {
if (i%2==0) {
String[] ss2 = ss1[i].split(",");
for (int j=0; j<ss2.length; j++)
if (ss2[j].length()>0) System.out.println(ss2[j]);
} else
if (ss1[i].length()>0) System.out.println(ss1[i]);
}
public static void main(String[] args) {
String s = "1,\"123\",\"12,33\",7a,\"s1,c4,t7s\",ccc,\"ss\"";
List<String> result = new ArrayList<String>();
StringBuilder buf = new StringBuilder();
Stack<String> stack = new Stack<String>();
for (char c : s.toCharArray()) {
if (c == '"') {
buf.append("\"");
if (stack.size() == 0) {
stack.push(String.valueOf(c));
} else {
stack.pop();
result.add(buf.toString());
buf.delete(0, buf.length());
}
} else if (c == ',') {
if (stack.size() > 0) {
buf.append(",");
} else {
if (buf.length() > 0) {
result.add(buf.toString());
buf.delete(0, buf.length());
}
}
} else {
buf.append(c);
}
}
if (buf.length() > 0) {result.add(buf.toString());} for (String ss : result) {
System.out.println(ss);
}
}
}
List<String> list = new ArrayList<String>();
boolean isFlag = false;
StringBuilder temp = new StringBuilder();
for(char ch : s.toCharArray())
{
if('"' == ch)
{
isFlag = !isFlag;
}
else if(',' != ch)
{
temp.append(ch);
}
else
{
if(isFlag)
{
temp.append(ch);
}
else
{
list.add(temp.toString());
temp = new StringBuilder();
}
}
}
//添加结尾的字符
list.add(temp.toString());
for(String ss : list)
{
System.out.println(ss);
}
public class Test {
public static void main(String[] args) {
String s = "1,\"123\",\"12,33\",7a,\"s1,c4,t7s\",ccc,\"ss\"";
String [] result = s.split("\",|,\"|\",\""); //使用|
for (String ss : result) {
System.out.println(sss.repalceAll("\"", ""));
}
}
}
不一定会有",或,"或","。
恩,又忽略了,采用循环分割吧,8L给了段sample
看了一下,5L的方法也挺好的
String str = "2,1,\"22\",\"333,22\",\"32,22,22,23\",4,\"6\",5";
StringBuffer newStr= new StringBuffer("");
List <String>rslt = new ArrayList<String>();
boolean flg = true;
for(char c : str.toCharArray()){
if(c !=',' || !flg){
newStr.append(c);
}else if((c=='"' && flg )|| c==','){
rslt.add(newStr.toString());
newStr.delete(0, newStr.length());
}
if(c=='"') {
flg = !flg;
}
}
System.out.println(Arrays.toString(rslt.toArray()));
String str = "2,1,\"22\",\"333,22\",\"32,22,22,23\",4,\"6\",5";
StringBuffer newStr= new StringBuffer("");
List <String>rslt = new ArrayList<String>();
boolean flg = true;
for(char c : str.toCharArray()){
if(c !=',' || !flg){
newStr.append(c);
}else {
rslt.add(newStr.toString());
newStr.delete(0, newStr.length());
}
if(c=='"') {
flg = !flg;
}
}
System.out.println(Arrays.toString(rslt.toArray()));
}
List<String> ls=new LinkedList<String>();
for(String ss:s.split("\"")){
if(ss.startsWith(",") || ss.endsWith(",")){
for(String sss:ss.split(",")){
if(sss.trim().length()!=0){
ls.add(sss);
}
}
}else{
ls.add("\""+ss+"\"");
}
}
for(String ssss:ls){
System.out.println(ssss);
}
String s = "1,\"123\",\"12,33\",7a,\"s1,c4,t7s\",ccc,\"ss\"";
List<String> ls=new LinkedList<String>();
for(String ss:s.split("\"")){
if(ss.startsWith(",") || ss.endsWith(",")){
for(String sss:ss.split(",")){
if(sss.trim().length()!=0){
ls.add(sss);
}
}
}else{
ls.add("\""+ss+"\"");
}
}
for(String ssss:ls){
System.out.println(ssss);
}
用正则也不是不行,只是正则其实效率低,而且不好维护,用循环便利扩展性比较好。
给段用正则的sample,让需要正则的人去思考理解。import java.util.*;
import java.util.regex.*;
public class Test {
public static void main(String[] args) {
String s = "1,2\"33,22\",4,5,6,\"3,22\"";
Pattern p = Pattern.compile("(\".*?(,.*?)*\")|(.*?([^,]|[\"])*)");
Matcher m = p.matcher(s);
List<String> result = new ArrayList<String>();
while(m.find()) {
if (m.group(0).length() > 0) {
result.add(m.group(0));
}
}
for (String ss : result) {
System.out.println(ss);
}
}
}
import java.util*;
import java.util.regex.*;
public class Test {
public static void main(String[] args) {
String s = "1,2\"33,22\",4,5,6,\"3,22\"";
Pattern p = Pattern.compile("(\".*?(,.*?)*\")|(.*?([^,\"])*)");
Matcher m = p.matcher(s);
List<String> result = new ArrayList<String>();
while(m.find()) {
if (m.group(0).length() > 0) {
result.add(m.group(0));
}
}
for (String ss : result) {
System.out.println(ss);
}
}
}
public static void splitStr (String str){
List params = new ArrayList();
int beginIndex = 0;
boolean canSplit = true;
for(int i = 0;i<str.length();i++){
char curChar = str.charAt(i);
if (i == str.length()-1){
params.add(str.substring(beginIndex,i+1).replaceAll("\"", ""));
}else if(curChar == ',' && canSplit){
params.add(str.substring(beginIndex,i).replaceAll("\"", ""));
beginIndex = i+1;
}else if(curChar == '"'){
canSplit = !canSplit;
}
}
}
这个思路是可行的,具体没跑。
如果要保留空串,split的时候需要加上判断。
if (str.length()>0 && beginIndex<=str.length()) {
params.add(str.substring(beginIndex).replaceAll("\"", ""));
}
就好了
String[] tests = new String[] {
"1,2,\"22\",\"333,22\",\"32,22,22,23\",4,\"6\",5",
"\"1\",\"2,3,4\",5,6",
"\"1,2,3,4,5,6\"",
"1,3,5",
"1,\"1,2,3,4,5,6\"",
"1,\"1,2,3,4,5,6\",1,\"1,2,3,4,5,6\""
};
String regex =
"\\G(?:^|,) \n"
+ " (?: \n"
+ " # 要么是双引号字段... \n"
+ " \" # 字段起始双引号 \n"
+ " ( [^\"]*+ ) \n"
+ " \" # 字段结束双引号 \n"
+ " |# ... 要么是 ... \n"
+ " # 非引号非逗号文本 ... \n"
+ " ( [^\",]*+) \n"
+ " ) \n";
Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS);
for (String test : tests) {
Matcher matcher = pattern.matcher(test);
System.out.println(test);
while (matcher.find()) {
String group1 = matcher.group(1);
String group2 = matcher.group(2);
String field = group1 == null ? group2 : group1;
System.out.println(field);
}
System.out.println("==========================");
}
String str = "1,\"123\",\"12,33\",7a,\"s1,c4,t7s\",ccc,\"ss\",2"; List<String> result = new ArrayList<String>();
StringBuffer sb = new StringBuffer();
boolean flag = false; char[] ca = str.toCharArray();
for (int i = 0; i < ca.length; i++) {
if (ca[i] == '"' && !flag) {
flag = true;
} else if (ca[i] == '"' && flag) {
flag = false;
} else if (ca[i] == ',' && !flag) {
result.add(sb.toString());
sb.delete(0, sb.length());
continue;
}
sb.append(ca[i]);
}
result.add(sb.toString()); System.out.println(result);
}
用正则其实效率不一定高,而且不好维护,自己循环扩展性比较好。
修改了一下正则的方法,追加了,,,等连续,的判断import java.util.*;
import java.util.regex.*;
public class SCT {
public static void main(String[] args) {
//测试数据[1][2]["33,22"][4][5][6][][][]["33,22][""][]
String s = "1,2\"33,22\",4,5,6,,,,\"3,22\",\"\",";
Pattern p = Pattern.compile("(\".*?(,.*?)*\")|(.*?([^,\"])*)");
Matcher m = p.matcher(s);
List<String> result = new ArrayList<String>();
int end=0;
while(m.find()) {
if (m.end(0)-end > 0) { //判断捕获组的结束位置和上次位置是否有变化
result.add(m.group(0));
end = m.end(0);
}
}
System.out.println(result.size());
System.out.println("----------");
for (String ss : result) {
System.out.printf("[%s]\n", ss);
}
}
}
public class SCT {
public static void main(String[] args) {
//测试数据[][1][2]["33,22"][4][5][6][][][]["33,22][""][]
String s = ",1,2\"33,22\",4,5,6,,,,\"3,22\",\"\",";
Pattern p = Pattern.compile("(\".*?(,.*?)*\")|(.*?([^,\"])*)");
Matcher m = p.matcher(s);
List<String> result = new ArrayList<String>();
int end=0;
while(m.find()) {
if (end==0 || m.end(0)-end > 0) { //仅修改此处
result.add(m.group(0));
end = m.end(0);
}
}
System.out.println(result.size());
System.out.println("----------");
for (String ss : result) {
System.out.printf("[%s]\n", ss);
}
}
}