【问题标题】:Parse commas not surrounded by brackets解析逗号不被括号包围
【发布时间】:2012-09-06 17:17:24
【问题描述】:

输入是以逗号分隔的字段列表。

这是一个例子。

tna,performance,ma[performance,3],price

问题是某些“字段”在方括号中指定了参数,并且这些参数也有逗号。

我可以用什么正则表达式来打破像逗号这样的字符串,只有当它们在括号之外时。我希望最终结果是

tna
performance
ma[performance,3]
price

【问题讨论】:

  • 想一想:方括号是正则表达式中的特殊字符。如果您在处理之前将方括号转换为尖括号,然后在处理后将它们转换回方括号(如果需要),您的正则表达式将更易于阅读和维护。但是,性能会受到影响。

标签: .net regex regex-lookarounds


【解决方案1】:

这是你需要的

(?<!\[[\w,]*?),

如果括号嵌套在括号内,请使用它,因为在那种情况下上面会失败..

(?<!\[[\w,]*?),(?![\w,]*?\])

作品here

【讨论】:

  • 虽然很少有语言支持 *+ 内部后视。
  • 是的,.NET 支持它。我相信 Perl 也是如此,但如果我没记错的话,只是在更新的 Perl 版本中。啊,等等,我刚刚看到使用 .NET 提到的 OP。
  • @BartKiers .net 的正则表达式是基于 perl..也许 perl 和 .net 几乎没有任何区别
  • 许多正则表达式实现都提到它们是 PCRE(Perl 兼容正则表达式),但几乎所有(如果不是全部(!))在语法和/或功能上都与 Perl 略有不同。
  • 我可能有点偏颇,但.NET 似乎拥有更强大且功能更丰富的正则表达式实现之一。平衡分组是我的最爱之一。
【解决方案2】:

试试这个:

"[a-z0-9]*(\\[[a-z0-9\\[\\],]+\\])*"

【讨论】:

  • 关闭。零个或多个匹配会在 Match 集合中为您提供很多空结果,并且字符类可以匹配任何位置(包括括号内)。试试这个:(?&lt;=^|,)[a-z]+(\[[^\[\]]+\])*
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 1970-01-01
  • 2014-10-19
  • 1970-01-01
相关资源
最近更新 更多