下面这个字符行,其中以""做分割的是字符串,没有""的是数字,逗号作为分隔符。"a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"分割出来的元素是:
a
bc
d0
9.3
java,c++,vb
9
6.2
inter"face"blank求能够实现这样分割的代码。(上面这个字符行只是一个示例,有很多这种格式的字符行等待处理)
分割出来的元素都放在一个数据结构中。

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【zhaolinger2】截止到2008-07-18 10:38:34的历史汇总数据(不包括此帖):
    发帖的总数量:16                       发帖的总分数:630                      每贴平均分数:39                       
    回帖的总数量:70                       得分贴总数量:16                       回帖的得分率:22%                      
    结贴的总数量:15                       结贴的总分数:530                      
    无满意结贴数:1                        无满意结贴分:20                       
    未结的帖子数:1                        未结的总分数:100                      
    结贴的百分比:93.75 %               结分的百分比:84.13 %                  
    无满意结贴率:6.67  %               无满意结分率:3.77  %                  
    值得尊敬
      

  2.   

    String  str=..
    String s[]=str.split(",");
      

  3.   

    "inter"face"blank" 这个太变态了点吧,引号里面又是引号??晕死你能编译过去么?都没有转义
      

  4.   

    首先把这个字符行连成一个字符串
    然后String  str=.. 
    String s[]=str.split(",");
      

  5.   

    java,c++,vb这个更变态,如果先用‘,’分割那部就马上错了吗?
    看啦只能用遍历的方法一个一个char按条件然后分割
    1.如果是‘"’的判断前一个或者后一个是否是‘,’如果是去掉,不是保留。
    2.如果是‘,’就判断前一个和后一个是不是‘"’,如果是去掉或者替换成另外一个不会出现的特殊符合,不是保留。这样你可以根据判断生成每个字符串或者按替换后的特殊符号做分割。
      

  6.   

    先贴个笨方法:public class RegxTest { public static void main(String[] args) {
    String data = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
    // \s\,\s|\"\s\,\s|\s\,\s\"|\"\s\,\s\"
    String[] sa = data.split("(\\\"\\s*\\,\\s*\\\")|(\\\"\\s*\\,\\s*)|(\\s*\\,\\s*\\\")|(\\s*\\,\\s*)|(\\s*\\\")|(\\\"\\s*)");
    for (String s : sa) {
    System.out.println(s);
    }
    }}
      

  7.   


    如果你的字符串中没有"inter"face"blank" 这个鬼怪东西出现,就是说不出现双引号里面包含双引号的情况。我倒是有个很好的方法可以帮助分解。
    例如:对这个"a","bc","d0","9.3","java,c++,vb",9,6.2 字符串
     Pattern p = Pattern.compile("(\")[^\"]*\\1(?=,)?|(\\d+\.{0,1}\\d*)(?=,)?");
     Matcher m = p.matcher("\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2");
    //这里得到的字符串就是 "a" "bc" 等等 ,数字是9 6.2
    while(m.find()){
       String s=m.group();
       //看看如果是引号开头,则去头去尾
       if(s.indexOf("\"")){
         s=s.substring(1,s.length()-1);
      }
      System.out.println(s);
    }
      

  8.   

    这个字符串太变态了吧"inter"face"blank" "java,c++,vb"不太好处理。
      

  9.   

    public static void main(String[] args) {
    try {
    String string = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
    String[] arr = string.split("^\"|\"?,(\"|(?=\\d))|\"$");
    String[] arr2 = new String[arr.length - 1];
    System.arraycopy(arr, 1, arr2, 0, arr.length - 1);

    for (String string2 : arr2) {
    System.out.println(string2);
    } } catch (Exception e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    }
      

  10.   

    a
    bc
    d0
    9.3
    java,c++,vb
    9
    6.2
    inter"face"blank
      

  11.   

    随便也个代码,没有测试,给楼主个启发.String string ;//这个表示是楼主要分隔的"a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"
    ArrayList list = new ArrayList();//这个表示楼主要保存的那个数据结构.
    String sa [] = string.split("\,");
    for(int i=0;i<sa.length;i++){
         if(sa[i].charAt(0)=='"' && sa[i].charAt(sa[i].length()-1)=='"'){
              list.add(sa[i].substring(1,sa[i].length()));
         }else{
              list.add(Float.valueOf(sa[i]));
         }
    }
    //这样list就是分隔后的结果了.数字是用Float对象来保存的.
      

  12.   

    不知道楼主对顺序要求的严不严,
    我是这样实现的, public static void do10(){
    String tempstr="";
    String str ="\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
    Pattern pattern = Pattern.compile("\"([^\"]+)\"",Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
    Matcher m = pattern.matcher(str);
    while(m.find()){
    tempstr+=m.group(1)+"#";
    }
    str=str.replaceAll("\"([^\"]+)\"(,)?","");
    String[] a=str.split(",");
    for(int i=0;i<a.length;i++){
    tempstr+=a[i]+"#";
    }
    System.out.println(tempstr);
    }
      

  13.   

    你把String tempstr="";改成数组就行了,
      

  14.   


    public static void do10(){
    String tempstr="";
    String str ="\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
    Pattern pattern = Pattern.compile("\"(([^\"]+)\"[^,]*)",Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
    Matcher m = pattern.matcher(str);
    while(m.find()){
    System.out.println(m.group(1));
    tempstr+=m.group(1)+"#";
    }
    str=str.replaceAll("\"(([^\"]+)\"[^,]*)","");
    String[] a=str.split(",");
    for(int i=0;i<a.length;i++){
    tempstr+=a[i]+"#";
    }
    System.out.println(tempstr);
    }
      

  15.   

    改了一下下,可以分割负数了:    public static void main(String[] args) {
            try {
                String string = "\"a\",\"bc\",\"d0\",\"-9.3\",\"java,c++,vb\",-9,6.2,\"inter\"face\"blank\"";
                String[] arr = string.split("^\"|\"?,(\"|(?=-?\\d))|\"$");
                String[] arr2 = null;
                
                if (string.startsWith("\"")) {
                 arr2 = new String[arr.length - 1];
                 System.arraycopy(arr, 1, arr2, 0, arr.length - 1);
                } else {
                 arr2 = arr;
                }
                
                for (String string2 : arr2) {
                    System.out.println(string2);
                }        } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
      

  16.   

    这是一个完整的,但是没有实现顺序与给定一至,
    public static void do10(){
    String tempstr="";
    ArrayList list = new ArrayList();
    String str ="\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
    Pattern pattern = Pattern.compile("\"(([^\"]+)\"[^,]*)",Pattern.CASE_INSENSITIVE|Pattern.DOTALL);
    Matcher m = pattern.matcher(str);
    while(m.find()){
    tempstr+=m.group(1)+"#";
    list.add(m.group(1));
    }
    str=str.replaceAll("\"(([^\"]+)\"[^,]*)(,)?","");
    String[] a=str.split(",");
    for(int i=0;i<a.length;i++){
    tempstr+=a[i]+"#";
    list.add(a[i]);
    }
    System.out.println(tempstr);
    for(int i=0;i<list.size();i++){
    System.out.println(list.get(i));
    }
    }
      

  17.   

    你这个不是 CSV 的格式,有点困难的。CSV 文件的格式:1,每个字段采用逗号分隔; 
    2,字段中若有逗号的话,则字段两边放上引号("); 
    3,字段中若出现引号(")则采用两个引号("")表示,并在字段的两边放上引号(")。 
      

  18.   

    如果是你所说的这种格式:"a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank" 我们来看看 "java,c++,vb" 这一块,既然里面可以随便放入 " ,好我们就可以改成:
    "java","c++","vb" 这样的话就变成三个字段了,实际上需要的是 java","c++","vb因此,你所说的这种格式无解
      

  19.   

    如果是按照 CSV 的文件格式第 3 中所说的,把引号中的引号改成两个引号的话,这是有解的。
      

  20.   

    joejoe1991 的正则强,不过还有问题,试试这个字符串String string = "\"a\",\"bc\",\"d0\",\"-9.3\",\"java,22,vb\",-9,6.2,\"inter\"face\"blank\"";
      

  21.   

    楼主的意思是不是这个字符行是从txt文件里读出来的?
    "java,c++,vb"
    "inter"face"blank"
    这两个地方真变态
      

  22.   


    嗯,如果把 "inter"face"blank" 改成 "inter""face""blank" 这样的话,就是标准的了,就可以处理了。
      

  23.   

    忙活了一个小时
    拿分来了
    t1.txt里内容:
    "a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"  FileReader fr = new FileReader("t1.txt");
      BufferedReader br = new BufferedReader(fr);
      String s = br.readLine();
      System.out.println(s);
      List<String> list = new ArrayList<String>();
      s = "," + s;//便于统计
      int count = 0;//统计"的个数
      int begin = 0;
      boolean b = false;
      for(int i = 1; i < s.length(); i++) {
      if(s.charAt(i) == '"') {
      count++;
      if(count % 2 == 1 && s.charAt(i - 1) == ',') {
      b = true;//说明该字符处于一个字符串中
      }
      if((count % 2 == 0 && i < s.length() - 1 && s.charAt(i + 1) == ',') || 
      (count % 2 == 0 && i == s.length() - 1)) {
      b = false;//一个字符串的结尾
      }
      }
      if(s.charAt(i) == ',' && !b) {//!b说明这个,是一个分隔符
      list.add(s.substring(begin + 1, i));
      begin = i;
      }
      }
      list.add(s.substring(begin + 1, s.length()));
      for(String t : list) {
      if(t.charAt(0) == '"') {
      t = t.substring(1, t.length() - 1);
      }
      System.out.println(t);
      }执行结果
    "a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"
    a
    bc
    d0
    9.3
    java,c++,vb
    9
    6.2
    inter"face"blank
      

  24.   

    做数字判断也容易
    遍历的时候改一下就ok  List<Integer> l = new ArrayList<Integer>();
      for(int i = 0; i < list.size(); i++) {
      String t = list.get(i);
      if(t.charAt(0) == '"') {
      t = t.substring(1, t.length() - 1);
      System.out.println("字符串\t" + t);
      }else {
      l.add(i);
      System.out.println("数字\t" + t);
      }
      }结果:
    "a","bc","d0","9.3","java,c++,vb",9,6.2,"inter"face"blank"
    字符串 a
    字符串 bc
    字符串 d0
    字符串 9.3
    字符串 java,c++,vb
    数字 9
    数字 6.2
    字符串 inter"face"blank
      

  25.   

    笨方法一个,不过-9也可以,但是会打乱顺序.... public void codes() {
    String a = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",-9,6.2,\"inter\"face\"blank\",9,\"9.5\"";
    System.out.println(a);
    int s = 0;
    int e = 0;
    int x = 0;
    String tmp1, tmp2;
    ArrayList<String> l = new ArrayList<String>();
    while (true) {
    x++;
    if (x > a.length()) {
    break;
    } else if ((s = a.indexOf(",\"")) > 0) {
    tmp1 = a.substring(0, s + 1);
    if ((e = (a.substring(s)).indexOf("\",")) > 0) {
    tmp2 = a.substring(s + e + 1);
    l.add(a.substring(s + 2, s + e));
    System.out.println(a.substring(s + 1, s + e + 1));
    a = tmp1 + tmp2;
    //
    }
    } else {
    break;
    }
    }
    for (String string : a.split(",")) {
    if ("".equals(string)) {
    continue;
    } else {
    if (string.startsWith("\"") && string.endsWith("\"")) {
    l.add(string.substring(1, string.length() - 1));
    } else l.add(string);
    }
    }
    System.out.println(a);
    System.out.println(l);
    System.out.println(l.size());
    }
      

  26.   

    楼主是不是要做文本入库啊,如果是这样,建议可以把分隔符换掉,然后用数据库的load语句去load文本。把分隔符换成不常用的分隔符,比如%|%,我们以前有个文本就是这么做的,然后这样load到数据库里面就没有什么问题了,何必花这么大的劲用程序去解决呢
      

  27.   

    public class Test { /**
     * @param args
     */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    String a = "\"a\",\"bc\",\"d0\",\"9.3\",\"java,c++,vb\",9,6.2,\"inter\"face\"blank\"";
    String[] b=a.split(",");
    for(int i=0;i<b.length;i++){
    if(b[i].startsWith("\"") && b[i].endsWith("\"")){
    System.out.println(b[i].substring(1,b[i].length()-1));
    }else if( b[i].matches("[0-9].?\\d*")){
    System.out.println(b[i]);
    }else if(b[i].startsWith("\"")){
    System.out.print(b[i].substring(1,b[i].length())+",");
    }else if(b[i].endsWith("\"")){
    System.out.println(b[i].subSequence(0, b[i].length()-1));
    }else{
    System.out.print(b[i]+",");
    }
    }
    }
    }