2012-07-15 101 views
2

我试图形成一个正则表达式,它将匹配“看起来”像数组的字符串。将字符串匹配到数组的正则表达式

  • 必须与[{(
  • 开始必须与]},或)结束
  • 不要紧,如果开始和结束使用相同的托架(如(....}是罚款)
  • 项目是以逗号分隔
  • 忽略所有空白类型
  • 空数组必须接受

我想出什么样的主意最初是

'/\s*[\[|\{|\(]\s*\w+\s*[,\s*\w+]*\s*[\]|\}|\)]\s*/' 

不幸的是这不接受空数组。所以,我试图另一个

'/\s*[\[|\{|\(][\s*\w+\s*]?[,\s*\w+]*\s*[\]|\}|\)]\s*/'` 

这一个允许空数组,但也允许与开口支架(例如[, item, item])后逗号开始的阵列。

我目前正在做的是使用两个不同的正则表达式并检查其中一个或另一个匹配。另一个正则表达式类似于我在这里提到的第一个正则表达式,但是它只允许打开和关闭标记之间的零个或多个空白字符。

回答

3

为了清楚起见,我使用了下面的空格和换行符。应该删除它们或使用忽略它们的正则表达式选项。我发现这样开发正则表达式更容易。

[\[\{\(] 
    \s* 
    (
    | 
     \w+\s* 
     (,\s*\w+\s*)* 
    ) 
[\]\}\)] 

这没有经过测试,但我希望它非常接近。

+0

出于某种原因,我让parens捕获子模式的事实使我不知道它可以用来列出替代品。方括号可以相似地嵌套,或者是使用parens的原因吗? – Matt 2012-07-15 06:55:54

+0

@Matt在我熟悉的所有正则表达式系统中,[]仅用于[a-z0-9_]等范围。他们不嵌套,也不分组。 ()用于捕获和修改运算符顺序,就像算术(1 + 2)* 3与1 + 2 * 3一样。 ()可以嵌套。给定的一对()的捕获部分通常可以被禁用,例如perl中的(?:expression)。 – walrii 2012-07-15 15:12:06

1

尝试将一个空数组视为特殊情况,或者将其与已有的已填充数组正则表达式对待。类似于(未经测试):

'(?:[\({[]\s*[\)}\]]|/\s*[\[|\{|\(]\s*\w+\s*[,\s*\w+]*\s*[\]|\}|\)]\s*)/' 
+0

我很难理解这是如何工作的。你能提供更多的解释吗? – Matt 2012-07-15 06:58:11