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

我有一个字符串

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)" ,仍然有一个逗号。 但我不想括号中的逗号。 有没有一种优雅的方法来解决这个问题?

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

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

RegEx演示

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

即使这对你有用。

 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 

FWIW:我不会为此使用前瞻性解决方案。

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

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

每次正则表达式找到逗号时,都必须这样做(?![^()]*\))

这样做是向前看,直到找到括号。
这意味着它也会匹配逗号。

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

比赛1:发现,outlook未来所有这些asdf,asdf,aasdf,aaaasdf,asdf,aasdf,asdf
比赛2:发现,outlook所有这些asdf,aasdf,aaaasdf,asdf,aasdf,asdf
第3场比赛:发现,outlook未来所有这些aasdf,aaaasdf,asdf,aasdf,asdf
第4场比赛:发现,outlook未来所有aaaasdf,asdf,aasdf,asdf
第5场比赛:发现,outlook所有这些asdf,aasdf,asdf
第6场比赛:发现,outlook未来所有这些aasdf,asdf
第7场比赛:发现,outlook所有这些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