【问题标题】:Validating minutes and seconds where minutes digits can range from 1-2验证分钟数字范围为 1-2 的分钟和秒
【发布时间】:2015-12-14 18:39:16
【问题描述】:

我有一个基于时间的正则表达式,可以成功验证分钟和秒:

validates_format_of :duration, with: /\A(?!00:00)[0-5][0-9]:[0-5][0-9]\Z/

我遇到的问题是,如果输入字符串2:30,我会收到验证错误。相反,它期望像02:30 这样的东西。我的第一个猜测是插入一个两位数的可选值,例如 d{1,2},但不知道如何将这样的内容与我现在的负前瞻结合起来。

【问题讨论】:

    标签: ruby-on-rails ruby regex validation time


    【解决方案1】:

    将您的正则表达式更改为以下内容,这使得第一个数字是可选的:

    /\A(?!00:00)[0-5]?[0-9]:[0-5][0-9]\Z/
    

    在初始 [0-5] 匹配器之后添加 ? 将允许它有 1 个或 0 个匹配项。这样,您将不需要前导零。

    如果您不希望前导零有效(因此需要 2:30 而不允许 02:30),您可以更进一步,将范围从 [0-5] 更改为 [1-5]

    /\A(?!00:00)[1-5]?[0-9]:[0-5][0-9]\Z/
    

    【讨论】:

    • 如果您也将前瞻中的第一个零设为可选,那就太好了。
    • @ndn 与 Wes 所拥有的相比,这会是什么样子?哪个会更高效?
    • @CarlEdwards,(?!0?0:00)。至于哪个会更高效 - Wes 的版本,但只是勉强。我的意思是 - 如果第一个数字可以是可选的,你可能也想排除 0:00
    • 是的。感谢分享。
    • @ndn 我必须注意,尽管您的负面前瞻性我仍然能够绕过验证。除非我写错了:/\A(?!0?0:00)[1-5]?[0-9]:[0-5][0-9]\Z/
    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-16
    • 2015-05-18
    • 1970-01-01
    相关资源
    最近更新 更多