正则表达式以逗号分隔的逗号分隔

时间:2009-03-10 00:53:59

标签: java regex

我无法编写正则表达式,在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
  4. 任何帮助非常感谢。

3 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

这有效:

String regex = "((?<!\\d),)|(,(?!\\d))";

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

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

"45651:65423,4565:45651"

然后此解决方案失败(作为示例)。如果您更具体地了解您期望的投入类型,我们可以根据您的情况量身定制答案。

答案 2 :(得分:0)

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

  

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

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

一个贪婪的表达式会在细分的最开始看到(,在最后看到)并在其中看到所有,无论是否关闭其他地方的括号。 没有什么会匹配。

从开头开始,一个不同意的表达式只会采用最小的表达式。它会匹配逗号b,但也会将此细分视为一个单元:(c,(d,)。然后它也会继续匹配逗号e,因为它已经是最后一个(

有一些引擎允许你处理嵌套级别,但表达式通常很丑陋且难以维护:除非你真正理解它,否则最好避免使用该功能。