由逗号分隔的拆分字符串,不考虑括号

时间:2016-01-07 16:28:47

标签: java regex string split

我有一个像

这样的字符串
s="abc, 3rncd (23uh, sdfuh), 32h(q23q)89 (as), dwe8h, edt (1,wer,345,rtz,tr t), nope";

我希望将其拆分为那些字符串

String[] parts={"abc", "3rncd (23uh, sdfuh)", "32h(q23q)89 (as)", "dwe8h", "edt (1,wer,345,rtz,tr t)", "nope"};

如果我只是简单地调用s.split(","),那么在修剪后我会得到不同的结果,因为在某些字符串中,例如"3rncd (23uh, sdfuh)",仍然有逗号。但我不想在括号中使用逗号。有没有一种优雅的方法来解决这个问题?

3 个答案:

答案 0 :(得分:4)

假设()未嵌套且未转义。您可以使用拆分:

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

RegEx Demo

,(?![^()]*\))将匹配逗号(如果后面没有非括号的文字和),则会忽略()中的逗号。

答案 1 :(得分:0)

即使这样也适合你。

public static void main(String[] args) {
    String s="abc, 3rncd (23uh, sdfuh), 32h(q23q)89 (as), dwe8h, edt (1,wer,345,rtz,tr t), nope";
    String[] arr = s.split(",\\s(?!\\w+\\))");
    for (String str : arr) {
        System.out.println(str);
    }
}

O / P:

abc
3rncd (23uh, sdfuh)
32h(q23q)89 (as)
dwe8h
edt (1,wer,345,rtz,tr t)
nope

答案 2 :(得分:0)

FWIW:我不会为此使用先行解决方案。

如果你有很多逗号,那么前瞻将会有一个延迟 对数,相对于逗号的数量。

原因是像这样使用的前瞻可以开放式 如果有可能没有任何东西可以终止外观 这不是一个好主意。特别是对大量数据样本。

每次正则表达式找到逗号时,都必须执行此操作(?![^()]*\))

在找到括号之前,它的前瞻性是什么 这意味着它也会匹配逗号。

如果您有这样的字符串asdf,asdf,asdf,aasdf,aaaasdf,asdf,aasdf,asdf
进展是

匹配1:发现,展望了所有这些asdf,asdf,aasdf,aaaasdf,asdf,aasdf,asdf 第2场比赛:发现,展望了所有这些asdf,aasdf,aaaasdf,asdf,aasdf,asdf 第3场比赛:发现,展望了所有这些aasdf,aaaasdf,asdf,aasdf,asdf 第4场比赛:发现,展望了所有这些aaaasdf,asdf,aasdf,asdf 第5场比赛:发现,展望了所有这些asdf,aasdf,asdf 第6场比赛:发现,展望了所有这些aasdf,asdf 第7场比赛:发现,展望了所有asdf

这是一个非常小的字符串,可以匹配所有这些东西。

对于分割或任何类型的匹配,使用这样的正则表达式永远不会好。

我只是匹配全局查找中的字段值。

"(?:\\A|\\G,\\s*)([^(),]*(?:(?:\\([^()]*\\))[^(),]*)*)"  

这是一个简单的基准测试,使用
来演示所述延迟 像这样的先行可能导致:

示例:260个字符,42个逗号

asdf,asdf,asdf,asdf,asdf,asdf,asdf,
asdf,asdf,asdf,asdf,asdf,asdf,asdf,
asdf,asdf,asdf,asdf,asdf,asdf,asdf,
asdf,asdf,asdf,asdf,asdf,asdf,asdf,
asdf,asdf,asdf,asdf,asdf,asdf,asdf,
asdf,asdf,asdf,asdf,asdf,asdf,asdf,
asdf,asdf,asdf,asdf,asdf,asdf,asdf,

基准

Regex1:   (?:\A|\G,\s*)([^(),]*(?:(?:\([^()]*\))[^(),]*)*)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   50
Elapsed Time:    2.97 s,   2972.45 ms,   2972454 µs


Regex2:   ,(?![^()]*\))\s*
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   49
Elapsed Time:    21.59 s,   21586.81 ms,   21586811 µs

当样本加倍时,时间会变得更糟......

Regex1:   (?:\A|\G,\s*)([^(),]*(?:(?:\([^()]*\))[^(),]*)*)
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   99
Elapsed Time:    5.89 s,   5887.16 ms,   5887163 µs


Regex2:   ,(?![^()]*\))\s*
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   98
Elapsed Time:    83.06 s,   83063.77 ms,   83063772 µs