2014-02-07 44 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]+

相关问题