使用正则表达式只允许字符串中的2位数

时间:2017-04-06 11:19:25

标签: regex

我需要正则表达式只允许输入字段中输入最大 2位数(或实际所需的限制值)。

该领域的要求如下:

  1. 允许a-z A-Z
  2. 允许0-9
  3. 允许-.字符
  4. 允许空格(\s
  5. 允许超过2位
  6. 允许任何其他特殊字符
  7. 我已经设法根据SO上的几个答案整理了以下regex

    ^(?:([a-zA-z\d\s\.\-])(?!([a-zA-Z]*\d.*){3}))*$  
    

    以上regex非常接近。它成功地用于以下方面:

    1. 测试12测试
    2. TEST12
    3. 测试test.12
    4. 但它允许输入:

      123(但不是1234,所以它已关闭)。

      仅数字输入字段时,只需输入12

      我希望找到比当前regex更有效,更清洁(如果可能)的解决方案,但它必须仍然是regex,而不是JS

2 个答案:

答案 0 :(得分:2)

你可以使用像

这样的积极前瞻
(?=^(?:\D*\d\D*){2}$) # only two digits
^[- .\w]+$            # allowed characters

请参阅a demo on regex101.com

答案 1 :(得分:1)

您可以使用在开头处锚定的负前瞻,一旦在字符串中的任何位置找到3位数字,将使匹配失败:

^(?!(?:[^0-9]*[0-9]){3})[a-zA-Z0-9\s.-]*$
 ^^^^^^^^^^^^^^^^^^^^^^^

请参阅regex demo

<强>详情:

  • ^ - 字符串开头
  • (?!(?:[^0-9]*[0-9]){3}) - 如果找到正好3个以下序列,那么负面预测会使匹配失败:
    • [^0-9]* - 除数字
    • 以外的零个或多个字符
    • [0-9] - 一个数字(因此,数字不必相邻)
  • [a-zA-Z0-9\s.-]* - 0 + ASCII字母,数字,空格,.-符号
  • $ - 字符串结束。