正则表达式将字符串与数组匹配

时间:2012-07-15 05:06:00

标签: php regex

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

  • 必须以[{(
  • 开头
  • 必须以]})
  • 结尾
  • 如果开始和结束使用相同的括号(例如(....}没问题)无关紧要
  • 项目以逗号分隔
  • 忽略所有空白区域
  • 必须接受空数组

我最初提出的是

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

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

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

这个允许空数组,但也允许在开始括号后面以逗号开头的数组(例如[, item, item])。

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

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

尝试将空数组视为特殊情况,或者使用已填充的数组正则表达式处理空数组。像(未经测试)的东西:

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