用逗号分割字符串并忽略多个双引号中的逗号

时间:2016-12-07 17:31:47

标签: java regex split

我有一个类似

的字符串
  

值1,值2,"值3,"值4,值5" ",价值6

我想用逗号分割它并忽略在多个双引号括起来的表达式中找到的逗号

我想要的输出应该是

  

值1

     

值2

     

"值3,"值4,值5" "

     

值6

我试过这个Splitting on comma outside quotes,但它不起作用

提前致谢........ Elsayed

2 个答案:

答案 0 :(得分:0)

我不知道如何使用正则表达式来解决它。

现在是否包括双引号?我还没有尝试过这段代码。

public static List<String> splitByComma(String text) {
    ArrayList<String> ret = new ArrayList<>();
    char[] chars = text.toCharArray();
    boolean inQuote = false;
    StringBuilder tmp = new StringBuilder();
    for (char ch : chars) {
        if (ch == ',') {
            if (inQuote) tmp.append(ch);
            else {
                ret.add(tmp.toString());
                tmp.setLength(0);
            }
        } else if (ch == '"') {
            tmp.append(ch); // I just add this code
            inQuote = !inQuote;
        } else tmp.append(ch);
    }
    ret.add(tmp.toString());
    return ret;
}

请告诉我我的代码是否有问题。

答案 1 :(得分:0)

首先我会建议逃避内部双引号,e。 G。值1,值2,&#34;值3,\&#34;值4,值5 \&#34; &#34;,值6.使用这种语法,我用于此目的的方法如下。它比第一个提案稍微复杂一点,因为它忽略了逗号和列表中下一个元素之间的空格和换行符。

public static String[] splitSet(String inStr, char delimiter) {
    if (inStr == null)
        return null;
    if (inStr.isEmpty())
        return new String[]{};
    /*
     * add an empty element here and remove it at the end to simplify
     * algorithm
     */
    String delimiterStr = String.valueOf(delimiter);
    String parseStr = inStr + delimiterStr + " ";
    /*
     * prepare parsing.
     */
    Vector<String> list = new Vector<>();
    String element = "";
    int lc = 0;
    char b = ' ';
    char c;
    boolean inBetweenQuotes = false;
    /*
     * parsing loop.
     */
    while (lc < parseStr.length()) {
        c = parseStr.charAt(lc);
        /*
         * add current entry and all following empty entries to list vector.
         * Ignore space and new line characters following the delimiter.
         */
        if ((c == delimiter) && !inBetweenQuotes) {
            // flag to avoid adding empty elements for delimiter being blank
            // or new line
            boolean added = false;
            while ((lc < parseStr.length())
                    && ((c == delimiter) || (c == ' ') || (c == '\n'))) {
                if ((c == delimiter)
                        && !(added && ((c == ' ') || (c == '\n')))) {
                    list.add((String) UFormatter.parseElement(element,
                            DataType.STRING, delimiterStr));
                    element = "";
                    added = true;
                }
                lc++;
                if (lc < parseStr.length())
                    c = parseStr.charAt(lc);
                if (lc > 0)
                    b = parseStr.charAt(lc - 1);
            }
        }
        /*
         * add character to tmpList. Close String literal or Vector literal
         */
        else {
            element = element + c;
            // toggle inBetweenQuotes at not escaped '"'
            if ((c == '"') && (b != '\\'))
                inBetweenQuotes = !inBetweenQuotes;
            lc++;
            b = c;
        }
    }
    if (!element.isEmpty() && inBetweenQuotes)
        list.add(element.substring(0, element.length() - 1) + "\"");
    else if (!element.isEmpty())
        list.add(element.substring(0, element.length() - 1));
    // put Vector to array.
    String[] ret = new String[list.size()];
    for (int i = 0; i < list.size(); i++)
        ret[i] = list.elementAt(i);
    return ret;
}