2017-03-17 39 views
1

是否有可能使用PHP的preg_match可变长度模式?例如,一个JSON样式列表。REGEX的列表

下面的正则表达式

\{[0-9]*\:[0-9]*\} 

比赛为

{1:2,2:7} 

但是我还需要它来匹配

{1:9,2:8} 

我设想类似

\{([0-9]*\:[0-9]*)[\,[0-9]*\:[0-9]*]*\} 

带有某种非必需的,但有效的,具有*

例分组:https://regex101.com/r/ZPSvs2/2

+1

什么问题是什么呢? – jeroen

+1

您的第一个示例应该是“{1:2}”吗? –

+1

如果可能的话,尽量避免REGEX,它可以使你的代码不可读。正则表达式有时可能有用,但通常有更好的解决方案。在你的例子中,我会使用'json_decode()'并从那里开始工作。 –

回答

1

您可以使用

\{[0-9]+:[0-9]+(?:,[0-9]+:[0-9]+)?} 

或 - 如果你也想匹配诸如{2:5,445:46,54567:5677}琴弦 - 使用

\{[0-9]+:[0-9]+(?:,[0-9]+:[0-9]+)*} 
           ^

查看regex demo

详细

  • \{ - 一个{符号(这是没有必要逃避它,但仍然是一个好主意)
  • [0-9]+ - 1+位数
  • : - 冒号(没有必要逃避它,因为它不是一个特殊的正则表达式元字符)
  • [0-9]+ - 1+ digits
  • - 10
  • (?:,[0-9]+:[0-9]+)? 1或0(由于?,与*替换如果需要允许0或更多)的序列:
    • , - 逗号
    • [0-9]+:[0-9]+ - 见上文
  • } - 文字结尾}

较短版本使用的子程序相同的正则表达式的:

\{([0-9]+:[0-9]+)(?:,(?1))?} 

参见another regex demo其中(?1)重复组1的模式。

+0

完美的谢谢你细节的细节,这是有道理的,适用于这种情况。 –

1

你似乎什么是后:

{\d+:\d+(,\d+:\d+)*} 

将匹配:

  • 前缘和后花括号
  • 一个或多个数字,一个冒号,一个或多个数字。
  • 零次或多次:
    • 逗号接着是一个或多个数字,冒号,和一个或多个数字。

该处理额外的情况下,如{1:9,2:8,2:7}