Java 非标准、结构化CSV-regexing结构

Java 非标准、结构化CSV-regexing结构,java,regex,csv,Java,Regex,Csv,我有一个CSV在以下公约 val1,val2,outerStruct1{valA,valB,innerStruct2{valX, valY},valC},... 问题是,当我尝试对outerStructure1进行正则化时,我得到: outerStruct1{valA,valB,innerStruct2{valX,valY} 相反: outerStruct1{valA,valB,innerStruct2{valX,valY},valC} 显然,它返回的是第一个},而不是最后一个(有效的)。我现

我有一个CSV在以下公约

val1,val2,outerStruct1{valA,valB,innerStruct2{valX, valY},valC},...
问题是,当我尝试对outerStructure1进行正则化时,我得到:

outerStruct1{valA,valB,innerStruct2{valX,valY}
相反:

outerStruct1{valA,valB,innerStruct2{valX,valY},valC}

显然,它返回的是第一个
}
,而不是最后一个(有效的)。我现在的正则表达式是:

([a-zA-Z0-9]{0,}\{.*.\})

如何将其展开以达到适当的右大括号

\{.*?\}(?=(?:[^{}]*|\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\})*$)

一般的想法是检查比赛结束后,只有平衡的花括号保留到字符串结束

但是,请注意,此正则表达式不是递归的,不会处理大于2级的嵌套

一般的想法是检查比赛结束后,只有平衡的花括号保留到字符串结束


但是,请注意,此正则表达式不是递归的,不会处理超过2个级别的嵌套。

我使用Java,但我认为我可以根据自己的目的从其他语言重新格式化正则表达式。这是
outerStruct1
innerStruct2
零件的结构是静态的还是在不同记录之间有所不同?吝啬重复操作符
*?
专门返回尽可能短的匹配。看起来您正在寻找贪婪的重复运算符
*
;但是你应该注意不要让比赛越过场地边界。正则表达式并不真正适用于这种情况,尽管它可以在有限的硬编码嵌套层中工作。@triplee,贪婪操作符确实正在穿过测试输入中的最后一个花括号,忽略了它们之间的结构。嵌套被限制在两个级别(意味着值结构的结构,例如:o{i1{1,2,3},i2{1,2,3})@amoosingo,Java正则表达式引擎不支持递归,所以如果我给你一个,它对你来说是无用的。我正在使用Java,但我认为我可以从其他语言重新格式化正则表达式以达到我的目的。这是
outerStruct1
innerStruct2
零件的结构是静态的还是在不同记录之间有所不同?吝啬重复操作符
*?
专门返回尽可能短的匹配。看起来您正在寻找贪婪的重复运算符
*
;但是你应该注意不要让比赛越过场地边界。正则表达式并不真正适用于这种情况,尽管它可以在有限的硬编码嵌套层中工作。@triplee,贪婪操作符确实正在穿过测试输入中的最后一个花括号,忽略了它们之间的结构。嵌套被限制在两个级别(意味着值结构的结构,例如:o{i1{1,2,3},i2{1,2,3})@amoosingo,Java正则表达式引擎不支持递归,所以如果我给你一个,它对你来说是无用的。事实上,它适用于超过两个级别!它正确匹配
val1,val2,o{valA,valB,i{valX,valY},valC,i{i2{i3{i5{val},val},val},val},val},val,val},val3
@amoosingo,我的意思是如果在那之后有另一个嵌套>2的值。事实上,我不得不对它进行一些更新,因为它只处理0和1个级别。事实上,它适用于超过2个级别!它正确匹配
val1,val2,o{valA,valB,i{valX,valY},valC,i{i2{i3{i5{val},val},val},val},val},val,val},val3
@amoosingo,我的意思是如果在那之后有另一个嵌套>2的值。事实上,我不得不更新它一点,因为它只处理0和1级。