2013-05-30 22 views
0

我有這樣的網站的URL結構:與檢查最後一組正則表達式存在

/some_url/{slug}/ 

其中{塞}有關於場序(僅價格和名稱),以便方向信息(ASC, desc),限制行(30,40或空)和表示類型(列表或空)。例如:

/some_url/price_desc_30_list/ 

正如你可以看到每個組由下劃線分開,但它只適用於中間組。每個組都是可選的,在前面的示例中,url由三個組price_desc,30list組成。我想要的是獲得每個組的價值。

目前我正則表達式是(?:(price|name)_(asc|desc))?(?:_?(30|40))?(?:_?(list))?但有下劃線的問題(我需要他們在只有前一組存在組的beggining),所以這個網址/some_url/_30//some_url/30/都將匹配,但我只需要/some_url/30/

回答

1

好吧,我試過的東西與此:

\/([^_\/]+)(?:_([^_\/]+)?_?)?(?:_([^_\/]+)?_?)?(?:_([^_\/]+)?_?)?\/$ 

而且在regex101測試。

不知道爲什麼

\/([^_\/]+)(?:_([^_\/]+)?_?){0,3}\/$ 

沒有工作,雖然:(

編輯:新的regex

^\/(.*?)\/(?:(?<!\/_)(price|name)(?!_\/))?_?(?:(?<!\/_)(asc|desc)(?!_\/))?_?(?:(?<!\/_)(30|40)(?!_\/))?_?(?:(?<!\/_)(list)(?!_\/))?\/$

Tested

(?!...)是一個負向預測,可以防止跟在前視內部的字符集之後的字符匹配。例如。 (list)(?!_\/)可防止list_/的匹配,因爲list之後是_/

(?<!...)是一個負反向背景,並防止前面的字符集在lookbehind內的字符匹配。例如。 (?<!\/_)(list)阻止/_list的匹配,因爲list之前有/_

+0

/SOME_URL/price_desc_ /匹配 – kirugan

+0

而且有一個很大的負,正則表達式你可以採取任何字符串值,例如:/ SOME_URL/price_hahahahahaha/ – kirugan

+0

@kirugan我明白了,我會盡量做到爲工作! – Jerry