2014-02-07 43 views
1

我工作的一個正則表達式的字符串來驗證頁碼爲唯一數字。我使用的正則表達式字符串是^products/([^/]+)/page-([^/]+[0-9]+)/sort-([^/]+)/?$和URL在本例中使用是products/mens/page-1/sort-newest-first,該字符串失敗,正則表達式匹配。但是一個2位數的工作 - 比如products/mens/page-10/sort-newest-first正則表達式允許和禁止字符

有人知道爲什麼它不允許規則中的一個數字卻2個位數以上是有效的?我難倒..

回答

1

問題頁碼在這裏:

^products/([^/]+)/page-([^/]+[0-9]+)/sort-([^/]+)/?$ 
         ^^^^^ 

這就是說,「在-和至少一個數字後跟/之間匹配除/以外的字符。」所以,如果你有...page-1/,只有一個字符總計[^/]+[0-9]+匹配,這將失敗。只需刪除[^/]+這裏:

^products/([^/]+)/page-([0-9]+)/sort-([^/]+)/?$ 
+0

所有提供的答案都是很好的和詳細的答案,但是這提供了最好的解決方案。乾杯埃德,你認爲[0-9] +還是\ d比較好?辯論使用.. – Banny

+1

很高興幫助! '[0-9]'和'\ d'是相同的,所以這是一個偏好問題。很多人會說'\ d'更好,因爲它更「純」,並且因爲'[0-9]'增加了混亂。其他人發現'\ d'稍微降低了可讀性。實際上,這並不重要,所以選擇最容易理解和維護的內容。 –

+0

好吧歡呼聲,我會堅持[0-9],因爲這對我來說更具可讀性。感謝您的解釋! – Banny

1

問題是page-後到來的[^/]+。原因是這樣說要查找至少一個不是/的字符,後面至少有一個數字。

因此,在有一個數字的例子中,它將被[^/]使用,但由於沒有至少一個數字,所以你的正則表達式將失敗。但是,兩位數或更多位數可以工作,因爲第一位數字將以相同的方式消耗,但至少有一位數字在其後面。

+0

啊,我明白了!乾杯..這是有道理的。仍然是新的正則表達式,並嘗試編輯使用通配符的代碼。它們都很好,除非你想要特定的字符處理,而不是。 – Banny

1

問題是page[^/]+。它更改爲[^/0-9]*

^products/([^/]+)/page-([^/0-9]*[0-9]+)/sort-([^/]+)/?$ 

[^/]+,其爲「1或多個」,被消耗的數目的第一位,當它緊跟"page-"

如果你讓「零個或多個」(允許沒有多餘的文字出現),也否定的數字,你會再捕捉[0-9]+

相關問題