【问题标题】:How To split String A,B,C,D,"E,F",G,H如何拆分字符串 A,B,C,D,"E,F",G,H
【发布时间】:2017-02-03 09:44:15
【问题描述】:

我想用comma(,) 运算符拆分此字符串A,B,C,D,"E,F",G,H,但不拆分"E,F".. 我想要以下输出。

A
B
C
D
E,F
G
H

【问题讨论】:

  • 发布代码以发现问题
  • 分享您与该案例相关的代码。
  • 使用一些 CSV 解析器。
  • 您可以先拆分为",然后拆分为,
  • 请分享您的尝试。 Stackoverflow 不相信听起来像“给我 d codez”的问题。有关如何在 stackoverflow 上提问的更多信息,请参阅:stackoverflow.com/help/how-to-ask

标签: java regex string


【解决方案1】:

这可能会有所帮助:

    String s = "A,B,C,D,\"E,F\",G,H";
    String[] tmp = s.split(",\"|\",");
    List<String> result = new ArrayList<>();

    for(int i=0; i<tmp.length; i++) {
        if (i % 2 == 0) {
            result.addAll(Arrays.asList(tmp[i].split(",")));
        }else {
            result.add(tmp[i]);
        }
    }

result 列表包含元素

【讨论】:

    【解决方案2】:

    这是一种不使用正则表达式的方法:

    private static List<String> splitQuoted(String string) {
        List<String> res = new ArrayList<>();
        int idx = 0;
        int start = 0;
        boolean inQuote = false;
        while (idx < string.length()) {
            char ch = string.charAt(idx++);
            if (ch == '"') {
                inQuote = !inQuote;
            } else {
                if (ch == ',' && !inQuote) {
                    res.add(string.substring(start, idx - 1));
                    start = idx;
                }
            }
        }
        if (start != idx)
            res.add(string.substring(start));
        return res;
    }
    

    它应该随着输入字符串的增长而很好地扩展,因为它只会向前看。您也可以通过使用char[] 数组而不是String.charAt() 来进一步提高其效率。它还会在输出值中留下引号字符,但在你去的时候删除它们是相当简单的。

    【讨论】:

      【解决方案3】:

      这个简单的正则表达式将匹配任何以逗号结尾的字符串":"([^\",]*\"[^\"]*\")*[^\",]*(,|$)",因此您可以将字符串拆分为逗号或匹配正则表达式的结束字符串字符,就像在这个函数中一样:

      private static List<String> splitByComma(String s) {
          List<String> output = new ArrayList<>();
          Pattern pattern = Pattern.compile("([^\",]*\"[^\"]*\")*[^\",]*(,|$)");
          Matcher matcher = pattern.matcher(s);
          while (matcher.find() && matcher.start() < s.length()) {
              output.add(s.substring(matcher.start(), (matcher.end() == s.length())?matcher.end():matcher.end() - 1));
          }
          return output;
      }
      

      【讨论】:

        【解决方案4】:

        正则表达式达到预期结果:

        String stringToSearch = "A,B,C,D,\"E,F\",G,H";
        Pattern p1 = Pattern.compile("(?:[^\",]+|\"[^\"]+\")+");
        Matcher m = p1.matcher(stringToSearch);
        while (m.find())
        {   
            System.out.println(m.group());
        }
        

        【讨论】:

          【解决方案5】:

          你可以使用 replace(); 来修复它

          String replaceString=s1.replace("\"","");//replaces all occurrences of "\"" to ""  
          

          然后拆分。

          【讨论】:

          • 他不想拆分“E,F”。
          猜你喜欢
          • 2019-12-19
          • 2019-01-07
          • 1970-01-01
          • 1970-01-01
          • 2022-11-29
          • 2013-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多