分隔字符串使用逗号分隔,如果是括号或引号则忽略逗号



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

给定一个字符串:

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

我想得到字符串数组如下:

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

我尝试了以下正则表达式(从另一个例子中得到):

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

效果如下:

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

使用负预判来断言下一个括号字符是而不是是右括号,并产生:

manikanta
Santhosh
ramakrishna(mani, santhosh)
tester

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

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

生成相同的,但是后面的逗号完整:

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

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

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

地点:

s+任意数量的空格

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

([^\)]*\()忽略(and)中的空白

([^\)\(]*$))所有空白,如果它们后面没有(and),这里用于用tester

分割部分

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

下面的代码(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,数组边界,…)。

相关内容

最新更新