2017-03-17 58 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}