【问题标题】:Regular Expression with a minus sign for negative values and leading zeroes for positive values正则表达式,负值带有负号,正值带有前导零
【发布时间】:2014-04-17 21:48:42
【问题描述】:

好的,所以我对使用正则表达式进行表单验证有一个奇怪的要求,

取值范围可以是-168到10688之间的整数,

负值的负号为 -168 到 10688。

这里棘手的部分是,对于所有正值,用户总是必须使用前导

零,负值需要 4 个字符,正值需要 5 个字符

例如:-023 有效,00000 和 00345 有效。 0、000、-000 无效。

这如何在正则表达式中实现?会不会太复杂了?

请帮忙! ;(

【问题讨论】:

    标签: javascript regex angularjs


    【解决方案1】:

    这应该会为你做的

    ^(\d{5}|\-(?!000)\d{3})$
    

    Akxe 关于可接受的最大值和最小值是正确的。 RegEx 仅用于字符串验证,因此它不允许使用数学函数。您必须使用 JavaScript 验证客户端或服务器端。

    【讨论】:

    • 我实际上也在使用 angularjs 做正则表达式客户端,我认为将 min="" max="" 属性添加到输入标签(并使用 input type="number")应该可以解决问题连同您的正则表达式的更清洁版本....感谢您的帮助!
    • 没问题。乐于助人:)
    【解决方案2】:

    此模式应符合您的描述:

    (-[1-9]\d\d|-\d[1-9]\d|-\d\d[1-9]|\d{5})
    

    排除 -000 是什么让这变得棘手,所以你最终得到 4 个案例:

    -[1-9]\d\d # negative numbers that have a non-zero digit in the first place
    -\d[1-9]\d # negative numbers that have a non-zero digit in the second place
    -\d\d[1-9] # negative numbers that have a non-zero digit in the third place
    \d{5} # all positive numbers with exactly 5 digits
    

    虽然这种模式不会检查上限/下限,因为这对于任何编程语言来说都是微不足道的,并且不是正则表达式的真正目标。

    【讨论】:

    • 这也匹配所有大于 10680 的值......我正在寻找的范围在 -168 和 10680 之间......
    • 为什么编程语言检查上限/下限是微不足道的?我看到这对正则表达式没有用,但它甚至可能吗?
    • 当然有可能,但是如果你决定你的 new 上层,你最终会得到一个 4 倍长的正则表达式模式,几乎无法理解并且真的很难改变例如,bound 应该是 23456。
    • 我明白了..这是有道理的,感谢您的帮助和解释!
    【解决方案3】:

    S.B.'答案 ((-[1-9]\d\d|-\d[1-9]\d|-\d\d[1-9]|\d{5})) 是正确的,但您可能仍然会看到必须将 minmax 属性添加到输入的事实。
    为了方便用户在使用您的应用程序时,您可能需要自己添加前导零,只是一个注释。
    PS.:这和角度有什么关系?

    【讨论】:

    • 我想我会把它扔在那里,因为我在前端使用 angularjs....使用 ng-pattern
    【解决方案4】:

    我认为这应该可行:

    (-|[0-9]{2})[0-9]{3}
    

    详情:

    NODE                     EXPLANATION
    --------------------------------------------------------------------------------
      (                        group and capture to \1:
    --------------------------------------------------------------------------------
        -                        '-'
    --------------------------------------------------------------------------------
       |                        OR
    --------------------------------------------------------------------------------
        [0-9]{2}                 any character of: '0' to '9' (2 times)
    --------------------------------------------------------------------------------
      )                        end of \1
    --------------------------------------------------------------------------------
      [0-9]{3}                 any character of: '0' to '9' (3 times)
    

    【讨论】:

    • "-023 是有效的" - 但不会使用这种模式。 o_O
    • 抱歉,这匹配了许多超出可接受值范围的值...不能是 [0-9]{4},因为这将匹配所有大于 10688 的名称一件事...谢谢
    • 嗯。我只关注数字格式部分。我认为 min/max 正则表达式不是最好的工具。为什么不在输入标签中添加 min="" max="" 属性(并使用 input type="number")?
    • 是的..我认为将 min="" max="" 属性添加到输入标签(并使用 input type="number")应该与 Bryan 的正则表达式更清晰的版本一起解决问题。 ...感谢您的帮助!
    猜你喜欢
    • 2022-01-10
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多