【问题标题】:Regular expression masked input正则表达式屏蔽输入
【发布时间】:2013-10-16 05:17:51
【问题描述】:

我正在尝试创建一个正则表达式掩码以限制输入字段。

到目前为止,我想出了这个

^[^0][0-9]*(,?[0-9]*)*$

以下应该是可接受的值:

123456,12,1,654,19512
2321
312,1

基本上任何给定的整数后跟一个逗号和另一个整数(位数无关紧要),但任何整数组都不应该以零开头。

但我错过了一些额外的表达式,因为以下值被接受并且不应该:

123,012
123,,0123
123,0,0
123,0,0,,,,0,31

非常感谢您的帮助,因为我是正则表达式代码的新手。

编辑:我知道该值可能有一个尾随逗号,但没关系,在提交值后我已经有一个输入验证

另外,我怎样才能让退格键在输入中起作用?

【问题讨论】:

    标签: javascript jquery regex


    【解决方案1】:

    您不应将逗号标记为可选

    ^[1-9][0-9]*(,[1-9][0-9]*)*$
    

    【讨论】:

    • 好吧,我在这里错过了什么:link 逗号不被接受
    • 当你写1,时,如你所描述的,这是一个invalid输入,但你必须接受它;否则用户不能输入任何逗号。您应该分两步进行验证,当用户输入时(一种预过滤)和当用户提交值时。
    • 是的,我知道后面可能有逗号,但您建议的正则表达式根本不接受任何逗号
    【解决方案2】:

    这样就可以了。

    ^[1-9]\d*(,\s*[1-9]\d*)*$
    

    以 1-9 开头的任何字符,后跟 0 位或更多位数字,后跟带有前置逗号 0 次或更多次的相同结构

    【讨论】:

    • 我做错了什么link逗号不被接受
    • 正如Guillame Poussel 所说,正则表达式对输入有效,但尾随逗号无效...一旦您输入逗号,需要后面的数字...如果您想接受尾随逗号,请使用^([1-9]\d*,?)+$,尽管它会接受1,23,45,之类的输入
    【解决方案3】:

    如果您在击键之间进行验证,此正则表达式可能会起作用。
    接受后需要不同的正则表达式。

     //  ^(?![0,]|[\d,]*,0$|[\d,]*,,$)[\d,]+$
    
     ^           # BOL
     (?!                    # Not any of these
          [0,]              # No 0 or , at beginning of string
       |  [\d,]* ,0 $       # No  ,0 at end of string
       |  [\d,]* ,, $       # No  ,, at end of string
     )
     [\d,]+      # validate these to restrict input chars
     $           # EOL
    

    【讨论】:

      【解决方案4】:

      我想添加评论,但最终写得太多,所以我将其转移到答案中。

      Guillaume Poussel 和 Luis Gonzalez 编写的正则表达式都是您想要的(尽管它们在语法上略有不同,更重要的是,Luis 的正则表达式允许逗号和整数之间有空格) - 用于结束验证。正如 Guillame Poussel 在他的评论中指出的那样,您需要分两步进行验证 - 一个作为输入掩码,一个作为完成验证。他们为您提供的正则表达式用于所有已完成的部分 - 您可能希望将此正则表达式放在输入控件的模糊事件上。对于控制输入(取消用户击键)的按键或类似事件,您需要一个更宽松的正则表达式,允许尾随逗号、前导零甚至以多个逗号结尾的字符串,即
      ^[1-9][0-9]*(,[0-9]*)*$

      如果您对客户端能够插入无效的输入字符串并被告知它没有任何问题,但在转到另一个字段或其他内容后被通知它无效,您也可以拥有一个您已经拥有的正则表达式得到了答案,但不是将其作为掩码正则表达式(如果输入无效则取消按键),您可以让该正则表达式将字段的背景更改为红色或类似的东西以立即通知该人输入,因为它目前是无效的。

      您也可以做一个混合解决方案,其中您有一个松散的掩码输入,就像我建议的那样和同一事件的最终正则表达式,但不是取消在所有完成的正则表达式失败时的按键,而是将背景更改为红色或其他任何东西,只有在松散的正则表达式失败时才取消。这样,您的用户就不会编写大多数无效的输入字符串,并且对于那些无效的输入字符串,(s)他会立即被通知它无效。

      【讨论】:

      • 如果我理解这一点,在 OP 的情况下,验证通过按键事件浮动,仅验证边缘条件。最终验证是一个简单的\d$。但我不知道,编辑器可能允许删除/箭头键等。如果是这样,则需要更多复杂性,例如在每次按键时将字符串上升到当前光标位置(即:甚至是控制字符)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-06-14
      • 1970-01-01
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 2017-08-17
      • 2019-04-09
      相关资源
      最近更新 更多