2015-08-14 36 views
1

下面的信息應該在兩個陣列劈裂:使用正則表達式來識別的NodeLists

  • foo089,酒吧[120-123,215]

期望的結果是兩個陣列具有所有列出的號碼其中[089]和[120-123,215](甚至更好的是120,121,122,123而不是120-123,這是可選的)。

應被解析的其它實例:

  • FOO [133,370,390-391],bar120
  • foo123
  • bar145
  • 巴[121303]
  • foo123,bar145

這些都應該導致一個兩元數組(第一個是foo,第二個是酒吧),有一個單一的條目(例如, 123或145)或範圍(例如133,370,390-391或121,303)。

我總是需要兩個數組,以便輕鬆確定數字是否屬於foo或bar。

限制

  • 富或酒吧不必存在
  • 如果兩者同時存在,它們總是有序
  • 的數字總是有3位
  • 只有foo和沒有其他詞
  • foo234,foo425是不允許的。如果富或酒吧有多個號碼,它被列在括號內

我到目前爲止嘗試了以下正則表達式:\d{3}|foo\d{3}|bar\d{3}|\d{3}-\d{3}。 但是,在PHP preg_grep我沒有得到所需的結果。

回答

2
^(?!foo\d{3},bar\d{3})(?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?,?(?:bar(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?$ 

現在,在匹配結果,第一組爲foo的數量和所述第二組爲bar的數字。

說明:

  1. (?:\d{3}(?:-\d{3})? - 三位數三位數破折號三位數
  2. (?:\d{3}(?:-\d{3})?,?)+ - 上述重複多次,可能由逗號分隔
  3. \[(?:\d{3}(?:-\d{3})?,?)+\] - 同一個th英格斯但在方括號
  4. |\d{3} - 可選地,只是三位數
  5. (?:foo(\[(?:\d{3}(?:-\d{3})?,?)+\]|\d{3}))?如上所述,但通過foo之前和可選製成與?
  6. ,? - 可選逗號分開FOO酒吧
  7. 酒吧部分幾乎是同一個
  8. (?!foo\d{3},bar\d{3}) - 禁止之類的東西foo123,bar456
  9. ^$ - 從開始到比賽結束

See it in action here

+0

看起來不錯!但是,我無法從php中的字符串中提取信息。如何從這個正則表達式中獲得兩個數組? – Frame91

+0

當您匹配時,第一組結果將是* foo *的數字,第二組 - 爲* bar *。又名'foo089,bar [120-123,215]'第一組返回'089',第二組返回'[120-123,215]'。 – ndn

+1

使用匹配組的示例[此處](http://goo.gl/mSEoj3)。 – ndn