2012-10-26 59 views
0

this question類似,但差別很小,我仍然需要一些幫助。解析可選部分的正則表達式

目前我有:

'(.*)\[(\d+\-\d+)\]' 

如我正則表達式,其匹配任何數目的字符,隨後包含由破折號分開的兩個小數方括號[]中。我的問題是,我希望它也與方括號之間的一個十進制數匹配,甚至可能在方括號之間沒有任何內容。所以:

word[1-5] = match 
word[5] = match 
word[] = match (not essential) 

,並確保

word[-5] = no match 

誰能可能指向我在下一步的方向。我目前發現正則表達式是一個猜謎遊戲,儘管我希望能和他們一起變得更好。

+0

你一定要明白,如果你的目標字符串公頃每行有多於一個'[dd-dd]'結構,那麼你的表達式只與最後一個匹配 - '(。*)'快樂地通過所有這些結構到行尾,然後引擎必須回溯到找到最後一個'[dd-dd]'。小心點星! – ridgerunner

+0

我確實:)在這種情況下,行尾的[dd-dd]格式將被剝離並用於確定一個範圍,其前面的任何內容即(。*)組將被視爲成爲「名字」 – PT114

回答

3

去與你做出最後一部分可選

(.*)\[(\d+(-\d+)?)\] 

使用?

爲了完成其他任務,好了,一起去?再次

(.*)\[(\d+(-\d+)?)?\] 
        ^here 

工作示例http://rubular.com/r/t0MaHyHfeS

1

使用?匹配0或1的匹配

所以使用?-\d+和由兩個數字分隔-

(.*)\[(\d+(-\d+)?)?\] 

不需要轉義- ..只有在字符類之間有特殊含義。

0

(.*)\[((\d+(?:\-\d+)?)?)\]

這將在那裏匹配一切,甚至用0數字和將反向引用你(在比賽[1-5]):

1-匹配 2- 1-5

0

並不是每一個正則表達式解釋器支持這一點,但你可以嘗試一個「或」運算符的括號內的部分:

'(.*)\[(\d+\-\d+|\d+)\]'