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

Php 将字符串与数组匹配的正则表达式,php,regex,Php,Regex,我正在尝试形成一个正则表达式,它将匹配“看起来”像数组的字符串 必须以[,{或( 必须以]、}或)结尾 开始和结束是否使用相同的括号并不重要(例如,(..}可以) 项目之间用逗号分隔 将忽略所有空白类型 必须接受空数组 我最初想到的是 '/\s*[\[|\{|\(]\s*\w+\s*[,\s*\w+]*\s*[\]|\}|\)]\s*/' 不幸的是,这不接受空数组。所以我尝试了另一个 '/\s*[\[|\{|\(][\s*\w+\s*]?[,\s*\w+]*\s*[\]|\}|\)]\s*

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

  • 必须以
    [
    {
  • 必须以
    ]
    }
    )结尾
  • 开始和结束是否使用相同的括号并不重要(例如,
    (..}
    可以)
  • 项目之间用逗号分隔
  • 将忽略所有空白类型
  • 必须接受空数组
我最初想到的是

'/\s*[\[|\{|\(]\s*\w+\s*[,\s*\w+]*\s*[\]|\}|\)]\s*/'
不幸的是,这不接受空数组。所以我尝试了另一个

'/\s*[\[|\{|\(][\s*\w+\s*]?[,\s*\w+]*\s*[\]|\}|\)]\s*/'`
这一个允许空数组,但也允许在开始括号后以逗号开头的数组(例如,
[,item,item]


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

尝试将空数组视为特例,或者使用填充的数组正则表达式你已经有了。比如(未经测试):


尝试将空数组视为特例,或者将其与已填充的数组正则表达式一起处理。类似(未测试):


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

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

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

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

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

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

出于某种原因,我让帕伦函数捕获子模式的事实蒙蔽了我,让我看不到它们可以用于列出备选方案的事实。方括号可以类似地嵌套吗?或者这是使用帕伦函数的原因吗?@Matt在我熟悉的所有正则表达式系统中,[]仅用于[a-z0-9_389;]等范围。它们不嵌套也不分组。()用于捕获和修改运算符顺序,就像在算术(1+2)*3 vs 1+2*3中一样。()可以嵌套。给定()对的捕获部分通常可以禁用,例如(?:表达式)在perl中。出于某种原因,我让parens捕获子模式的事实蒙蔽了我,让我看不到它们可以用于列出备选方案的事实。方括号可以类似地嵌套吗?或者这是使用parens的原因吗?@Matt在我熟悉的所有正则表达式系统中,[]仅用于像[a-z0-9]这样的范围。它们不嵌套也不分组。()用于捕获和修改运算符顺序,就像在算术(1+2)*3 vs 1+2*3中一样。()可以嵌套。给定()对的捕获部分通常可以禁用,例如(?:表达式)在perl中。我很难理解它是如何工作的。你能提供更多的解释吗?我很难理解它是如何工作的。你能提供更多的解释吗?