我有一个像
这样的字符串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)"
,仍然有逗号。但我不想在括号中使用逗号。有没有一种优雅的方法来解决这个问题?
答案 0 :(得分:4)
假设(
和)
未嵌套且未转义。您可以使用拆分:
String[] arr = input.split(",(?![^()]*\\))\\s*");
,(?![^()]*\))
将匹配逗号(如果后面没有非括号的文字和)
,则会忽略(
和)
中的逗号。
答案 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