2015-07-02 113 views
1

我使用標記對URL解析器進行篩選以過濾返回的結果,這些標記是可選項,可以按任意順序進行設置,只需在參數存在時獲取參數即可。以任意順序匹配可選標記的正則表達式

我已經做了一個正則表達式,可以得到令牌,但順序是非常重要的:,我會得到

\/test(\/page\/[0-9]+)?(\/criticality\/[0-9]+)?(\/order\/[a-zA-Z0-9]+)? 

您可以測試它here

在這個例子中/page/1/order/toto/criticality/5但臨界沒有得到。

如何以任何順序獲取任何令牌?

回答

0

您可以在模式的開頭讓他們有積極的向前看符號,並捕獲向前看符號中的文本,但你會列出這使得正則表達式的解決方案的值的所有可能的組合看起來很醜陋:

^(?=.*\/test(\/page\/[0-9]+))(?=.*(\/criticality\/[0-9]+))(?=.*(\/order\/[a-zA-Z0-9]+))|^(?=.*\/test(\/page\/[0-9]+))(?=.*(\/order\/[a-zA-Z0-9]+))|^(?=.*\/test(\/page\/[0-9]+))(?=.*(\/criticality\/[0-9]+))|^(?=.*(\/criticality\/[0-9]+))(?=.*(\/order\/[a-zA-Z0-9]+))|^(?=.*(\/criticality\/[0-9]+))|^(?=.*(\/order\/[a-zA-Z0-9]+))|^(?=.*\/test(\/page\/[0-9]+)) 

請參閱demo

如您所見,正則表達式不可維護。您將輸入字符串拆分爲/,然後檢查數組是否包含您的密鑰。如果是的話,你會得到作爲密鑰後面元素的值。

+0

令牌需要是可選項,這種方法不允許這樣做。 – poypoy

+0

請檢查我的更新。也許,正則表達式在這裏並不是最好的選擇。 –

+0

它幾乎工作,但它匹配許多時間相同的道理,特別是它不可維護,在這裏我只有3個參數,但在將來我可以添加其他人。 – poypoy

0

使用替代運算符。

\/test(\/page\/[0-9]+)|(\/criticality\/[0-9]+)|(\/order\/[a-zA-Z0-9]+) 

DEMO

但是,如果上述任何人的存在,這將匹配。它不會指望所有三個都應該在場。

+0

用這種方法我得到了3個本能匹配,我只需要一個匹配所有值(0到3個值)。 – poypoy

相關問題