繁体   English   中英

以逗号分隔的分割字符串,不考虑方括号中的逗号

[英]Split string delimited by comma without respect to commas in brackets

我有一个像

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*");

正则演示

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

即使这将为您工作。

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:找到,对所有此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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM