[英]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.