以逗号分隔的字符串,不包括括号内的字符串

时间:2018-12-21 11:18:52

标签: java regex string split

我要分割以下字符串:

给出字符串:

[PSR__123456_A,[AgrID=123456,PoolID=A],,Auto,Bank,0,0],[PSR__123456_A,[AgrID=123456,PoolID=A],,Auto,Bank,0,0],[PSR_Net__123456_A,[AgrID=123456,PoolID=A],,Suppress_Collateral,Bank,0,0]

预期结果:(3个元素)

[PSR__123456_A,[AgrID=123456,PoolID=A],,Auto,Bank,0,0]
[PSR__123456_A,[AgrID=123456,PoolID=A],,Auto,Bank,0,0]
[PSR_Net__123456_A,[AgrID=123456,PoolID=A],,Suppress_Collateral,Bank,0,0]

我尝试了以下正则表达式来解析/分割上面的字符串:

",(?![^[]*[]])" or ",(?=(((?!]).)*\[)|[^\[\]]*$)"

但是我仍然无法达到预期的结果,而是给了我以下结果(6个元素):

[PSR__123456_A
[AgrID=123456,PoolID=A],,Auto,Bank,0,0]
[PSR__123456_A
[AgrID=123456,PoolID=A],,Auto,Bank,0,0]
[PSR_Net__123456_A
[AgrID=123456,PoolID=A],,Suppress_Collateral,Bank,0,0]

是否有一种方法可以在Java(RegEx)中做到这一点而又不将字符串字符逐字符分割?

2 个答案:

答案 0 :(得分:3)

如果您要选择逗号的时间和右边应该是方括号的2倍和方括号的2倍,则可以使用:

,(?=\[[^[]*\[[^[]*\][^]]*\])

在Java中:

String regex = ",(?=\\[[^\\[]*\\[[^\\[]*\\][^]]*\\])";

请参见Regex demo | Java demo

这将匹配:

  • ,匹配逗号
  • (?=积极前瞻
    • \[[^[]*\[[^[]*\][^]]+\]符合条件:
    • \[匹配[
    • [^[]*否定的字符类别不匹配[
    • \[匹配[
    • [^[]*否定的字符类别不匹配[
    • \]匹配]
    • [^]]*否定的字符类别不匹配]
    • \]匹配]
  • )积极回望

答案 1 :(得分:2)

假设您的第一个元素以[PSR开头,则可以使用正向查找的正则表达式,如下所示:

,(?=\[PSR)

Working demo

使用\n作为替换字符串

更新:如他的评论中所述 Manish 一样,您实际上可以使用],[]\n[作为替换字符串

Working demo