拆分字符串使用逗号但如果它是括号或引号则忽略逗号

时间:2015-10-14 07:16:54

标签: java regex string split

我见过很多例子,但我没有得到预期的结果。

给定一个字符串:

"manikanta, Santhosh, ramakrishna(mani, santhosh), tester"

我想得到String数组如下:

manikanta,
Santhosh,
ramakrishna(mani, santhosh),
tester

我尝试了以下正则表达式(来自另一个例子):

"(\".*?\"|[^\",\\s]+)(?=\\s*,|\\s*$)"

3 个答案:

答案 0 :(得分:2)

这就是这个伎俩:

String[] parts = input.split(", (?![^(]*\\))");

使用负向前瞻来断言下一个括号char 是一个近括号,并产生:

manikanta
Santhosh
ramakrishna(mani, santhosh)
tester

根据你的问题所需的输出保留尾随逗号,我认为这是一个疏忽,但是如果你真的想要保留逗号:

String[] parts = input.split("(?<=,) (?![^(]*\\))");

生成相同的内容,但 with 尾随的逗号完整无缺:

manikanta,
Santhosh,
ramakrishna(mani, santhosh),
tester

答案 1 :(得分:0)

假设我们可以用空格分割(由于你的例子),那么你可以试试这个正则表达式\s+(?=([^\)]*\()|([^\)\(]*$)),如:

String str = "manikanta, Santhosh, ramakrishna(mani, santhosh), ramakrishna(mani, santhosh), tester";
String[] ar = str.split("\\s+(?=([^\\)]*\\()|([^\\)\\(]*$))");

其中:

\s+任意数量的空格

(?=...)正向前瞻,意味着在当前位置必须是字符串后,匹配到([^\\)]*\\()|([^\\)\\(]*$)

([^\\)]*\\()忽略(和)

中的空格

([^\\)\\(]*$))所有空格,如果它们后面没有(和),则此处用于分割带有tester字的部分

答案 2 :(得分:-1)

正如我在对这个问题的评论中所述,正则表达式可能无法解决这个问题。

以下代码(java)提供了一个提示:

private void parse() {
    String string = null;
    char[] chars = string.toCharArray();
    List<String> parts = new ArrayList<String>();

    boolean split = true;
    int lastEnd = 0;
    for (int i = 0; i < chars.length; i++) {
        char c = chars[i];
        switch (c) {
        case '(':
            split = false;
            break;
        case ')':
            split = true;
            break;
        }
        if (split && c == ',') {
            parts.add(string.substring(lastEnd, i - 1));
            lastEnd = i++;
        }
    }
}

请注意,代码缺少对约束的一些检查(假设字符串为null,数组边界,......)。