【问题标题】:Regex allowing and disallowing characters正则表达式允许和禁止字符
【发布时间】:2014-02-07 20:51:30
【问题描述】:

我正在处理一个正则表达式字符串,以仅将页码验证为数字。我正在使用的正则表达式字符串是^products/([^/]+)/page-([^/]+[0-9]+)/sort-([^/]+)/?$,示例中使用的网址是products/mens/page-1/sort-newest-first,该字符串因正则表达式匹配而失败..但是2位数字有效 - 例如products/mens/page-10/sort-newest-first

任何人都知道为什么它不允许规则中的一位数字但 2 位或更大的数字是有效的?我被难住了..

【问题讨论】:

    标签: regex


    【解决方案1】:

    问题出在这里:

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

    这表示,“在- 和至少一个后跟/ 的数字之间匹配/ 以外的字符。”所以,如果你有...page-1/,那么[^/]+[0-9]+ 总共只有一个字符可以匹配,这会失败。只需在此处删除[^/]+

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

    【讨论】:

    • 提供的所有答案都是很好且详细的答案,但这提供了最佳解决方案。干杯 Ed,你认为 [0-9]+ 还是 \d 更好?争论使用哪个..
    • 很高兴为您提供帮助! [0-9]\d 是相同的,所以这是一个偏好问题。许多人会说\d 更好,因为它“更纯净”,因为[0-9] 增加了混乱。其他人发现\d 略微降低了可读性。实际上,这并不重要,因此请选择最容易理解和维护的内容。
    • 好吧,我会坚持使用 [0-9],因为这对我来说更具可读性。感谢您的解释!
    【解决方案2】:

    问题在于page- 之后的[^/]+。原因是这表示要查找至少一个不是/ 的字符,后跟至少一个数字。

    因此,在具有一位数字的示例中,[^/] 将消耗它,但由于它后面没有至少一位数字,因此您的正则表达式将失败。但是,两位或更多数字会起作用,因为第一个数字会以相同的方式被消耗,但后面至少有一个数字。

    【讨论】:

    • 啊啊啊,我明白了!干杯..这是有道理的。正则表达式仍然是新手,并尝试编辑使用通配符的代码。在您想要对字符进行特定处理之前,它们都很好。
    【解决方案3】:

    问题是page 之后的[^/]+。改成[^/0-9]*:

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

    [^/]+,即“1 或多个”,在紧跟"page-" 时消耗数字的第一个数字。

    如果您将其设为“零或更多”(以允许没有额外的文本)并且还否定数字,那么您将使用 [0-9]+ 捕获页码

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-30
      • 1970-01-01
      相关资源
      最近更新 更多