正则表达式,用逗号分隔的逗号分隔
我无法编写正则表达式,在String.split(Java)表达式中使用,例如只能在逗号上拆分而不在括号中。
例:
(54654,4565):( 45651,65423),4565:45651,(4565,4564):45651
应该产生3个字符串:
- (54654,4565):( 45651,65423)
- 4565:45651
- (4565,4564):45651
任何帮助非常感谢。
你可以只用一个前瞻来做到这一点,这比使用后看更容易。
String[] parts = str.split(",(?![^()]*+\\))");
但其他响应者是对的:如果你不能自己拿出这个正则表达式,那么当需求发生变化时你会怎么做? 你可能更了解一个你真正理解的冗长解决方案。
这有效:
String regex = "((?
但是假设你在逗号或另一边有一个数字以外的东西。 所以,它并不是真的想看看你是否在内部,而是希望看到它不会分裂为只被数字包围的逗号。
因此,如果您正在查看此文本:
"45651:65423,4565:45651"
然后这个解决方案失败了(作为一个例子)。 如果您更具体地了解您期望的输入类型,我们可能会根据您的情况定制我们的答案。
只是提醒一下,如果有任何嵌套,你需要小心。 正则表达式并不是很擅长这一点。 请考虑以下代码段:
(一)B,(C,(d)E,)
根据您的问题,您只想匹配逗号b
。 诀窍在于,表达式通常要么完全贪婪,要么完全不贪婪,几乎没有中间立场。
一个贪婪的表达式会在最后看到(
在段的最开始处)
并且在其中包含所有内容 ,而不管其他地方是否有右括号。 什么都不匹配。
从一开始,一个不同意的表达式将只采用可能的最小集合。 它会匹配逗号b
,但也会将此段视为一个单元: (c,(d,)
。然后它将继续匹配逗号,因为它已经占用了最后一个(
。
有一些引擎可以让你处理嵌套级别,但是表达式通常很丑陋并且很难维护:除非你真的理解它,否则最好避免使用这个function。