【问题标题】:Non-standard, structured CSV - regexing structures非标准的结构化 CSV - 正则表达式结构
【发布时间】:2016-04-18 10:14:26
【问题描述】:

我有一个遵循以下约定的 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,}\{.*?\})

如何扩展它以到达合适的右大括号?

【问题讨论】:

  • 我正在使用 Java,但我认为我可以将其他语言的正则表达式重新格式化为我的目的。
  • outerStruct1innerStruct2 部分的结构是静态的还是在记录之间有所不同?
  • 吝啬的重复操作符*?专门返回最短的匹配。看起来您正在寻找贪婪的重复运算符*;但是您应该注意不要让匹配跨越字段边界。正则表达式并不真正适合这种情况,尽管它可以用于有限且硬编码的嵌套级别数。
  • @triplee,贪婪算子确实跨越了测试输入中的最后一个大括号,忽略了之间的结构。嵌套仅限于 2 级(表示值结构的结构,例如:o{i1{1,2,3},i2{1,2,3}})
  • @aMoosingOne,Java 正则表达式引擎不支持递归,所以如果我给你一个,它对你毫无用处。

标签: java regex csv


【解决方案1】:
\{.*?\}(?=(?:[^{}]*|\{[^{}]*(?:\{[^{}]*\}[^{}]*)*\})*$)

See it in action

一般的想法是检查你的匹配之后,只有平衡的大括号保留到字符串的末尾。

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

【讨论】:

  • 事实上,它适用于超过 2 个级别!它正确匹配val1,val2,o{valA,valB,i{valX, valY},valC,i{i2{i3{i4{i5{val}},val},val},val,val}},val3
  • @aMoosingOne,我的意思是如果在那之后有另一个嵌套 > 2 的值。事实上,我不得不稍微更新一下,因为它只处理 0 和 1 级别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多