正则表达式,用逗号分隔的逗号分隔

我无法编写正则表达式,在String.split(Java)表达式中使用,例如只能在逗号​​上拆分而不在括号中。

例:

(54654,4565):( 45651,65423),4565:45651,(4565,4564):45651

应该产生3个字符串:

  1. (54654,4565):( 45651,65423)
  2. 4565:45651
  3. (4565,4564):45651

任何帮助非常感谢。

你可以只用一个前瞻来做到这一点,这比使用后看更容易。

String[] parts = str.split(",(?![^()]*+\\))"); 

但其他响应者是对的:如果你不能自己拿出这个正则表达式,那么当需求发生变化时你会怎么做? 你可能更了解一个你真正理解的冗长解决方案。

这有效:

String regex = "((?

但是假设你在逗号或另一边有一个数字以外的东西。 所以,它并不是真的想看看你是否在内部,而是希望看到它不会分裂为只被数字包围的逗号。

因此,如果您正在查看此文本:

"45651:65423,4565:45651"

然后这个解决方案失败了(作为一个例子)。 如果您更具体地了解您期望的输入类型,我们可能会根据您的情况定制我们的答案。

只是提醒一下,如果有任何嵌套,你需要小心。 正则表达式并不是很擅长这一点。 请考虑以下代码段:

(一)B,(C,(d)E,)

根据您的问题,您只想匹配逗号b 。 诀窍在于,表达式通常要么完全贪婪,要么完全不贪婪,几乎没有中间立场。

一个贪婪的表达式会在最后看到(在段的最开始处)并且在其中包含所有内容 ,而不管其他地方是否有右括号。 什么都不匹配。

从一开始,一个不同意的表达式将只采用可能的最小集合。 它会匹配逗号b ,但也会将此段视为一个单元: (c,(d,) 。然后它将继续匹配逗号,因为它已经占用了最后一个(

有一些引擎可以让你处理嵌套级别,但是表达式通常很丑陋并且很难维护:除非你真的理解它,否则最好避免使用这个function。