java-Regex拆分包含多个组的字符串

java-Regex拆分包含多个组的字符串,java,regex,regex-lookarounds,Java,Regex,Regex Lookarounds,我需要把这根绳子分开 (2005)[1]1,2,3,4[2]1(2008)[2]2–;3,4(2009)[3]1,2,3-4(2010)[4]1,2,3-4(2011)[5]1(2012)[5]2,3-4[6]1,2\[\](2014)[6]3-4[7]1-2(2015)[7]3-4[8]1-2(2016)[10]1[8]3-4[9]1-2,3-4(2017)[10]2 作为: 1, "1,2,3,4" 2, 1 2 2, 2–;3,4 对于输入“(2005)[1]1,2,3,4”,我需

我需要把这根绳子分开

(2005)[1]1,2,3,4[2]1(2008)[2]2–;3,4(2009)[3]1,2,3-4(2010)[4]1,2,3-4(2011)[5]1(2012)[5]2,3-4[6]1,2\[\](2014)[6]3-4[7]1-2(2015)[7]3-4[8]1-2(2016)[10]1[8]3-4[9]1-2,3-4(2017)[10]2
作为:

1, "1,2,3,4"  
2, 1 2
2, 2–;3,4
对于输入“(2005)[1]1,2,3,4”,我需要捕获组1中[]中的值,以及捕获组2中字符串的其余部分(1,2,3,4),并对整个字符串重复

我已经创建了这个正则表达式字符串,但它没有按预期工作

\[(.*?)\](.+?)(?=\[|\(|$)

问题是,当[]之后没有任何内容是捕获(年)它不应该做的

时,
(.+?)(?=\[\124;\($)
模式的一部分匹配任何1个或多个字符,而不是最左边的换行符、
或字符串结尾。您需要允许在此处匹配零个或多个字符

但是,此处的否定字符类将更加高效和优雅:

\[(.*?)\]([^\[(]*)

或者更高效一点

\[([^\]\[]*)\]([^\[(]*)

详细信息

  • \[
    -a
    [
  • ([^\]\[]*)
    -第1组:除
    [
    ]
    之外的任何0+字符
  • \]
    -a
    ]
  • ([^\[(]*)
    -第2组:除
    [
    )之外的任何0+字符

试试看。另外,你也可以在你的模式中将
+?
替换为
*?
。它工作得非常好,这要感谢洛蒂创建了一个,但现在无法理解你的意思。请为每个测试用例提供准确的输出。因此,对于测试用例中的第一个示例,我想解析数据以生成此输出“2015”、“5”、“1”3、1、2、2、2、3、3、3、3、3、3、24“\n“2015”、“2015”、“3”、“3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、3、2、3、2、2、2、3、3、3、3、3、3)看,它是捕获了正确的价值吗?它是吗?它对大多数价值的工作很好。它对大多数价值的工作很好,但在大多数价值的情况下工作良好,但在(2005[2005[1[1[1]1[1]1[1]1[1]1[1]1[1]1[1]1]1,工作良好工作良好,但在(2005[1[1[1]1]1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,41]0(2013)[42]1-4(2014)[43]0(2015)[44]1-4,1-2(2017)[46]它不是在捡(1-4)你能帮忙吗?请用
[^\[(]*.
替换为
[^\[(]*(?:\(\d+-\d+\)[^\[(]*)*
或更通用的
[^\[(]*(?:((!\d{4})[^\])[^*)*
。如果你能在括号中的数字后解释一下你期望的价值,那就更好了。注意,我现在在手机上,无法检查我的模式是否正常工作。因此,我期望一年或空的brckts b-anythinghere或空的brckts c-somethinghere。格式可以是下面的任意一种(a)[b]c(a)[b]c[b]c(a)[b]c(a)[b]c[b]c(a]c[b]c[b]c[b]c(a)[b](a)[b]c[b]cI已用可能的格式更新了问题。我需要拆分字符串,以便将其匹配为group1->year,group2->val in[],group3->逗号分隔值请更新表达式,以便它可以捕获1-中的任何内容(),2-中的任何内容[]3-逗号分隔值之后的内容[]