正则表达式 - 每种符号类型的最小值和最大值

时间:2016-12-12 11:50:29

标签: regex

我需要检查字符串是否包含0到3个空格和16个数字。我怎样才能做到这一点 ?我想出的只是检查总和

^[0-9- ]{16,19}$

2 个答案:

答案 0 :(得分:2)

您可以根据前瞻使用此正则表达式:

^[0-9](?!(?:[0-9]* ){4})(?=(?: *[0-9]){15}$)[0-9- ]+[0-9]$

RegEx Demo

  • ^[0-9][0-9]$确保我们在开始和结束时只有数字。
  • (?!(?:[0-9]* ){4})是禁止4个空格的负面预测(因此允许0到3个空格)
  • (?=(?: *[0-9]){16} *$)是正向预测,允许在可选空格包围的输入中正好包含16位数字。

答案 1 :(得分:2)

你实际应该使用

^(?=(?:[^ ]* ){0,3}[^ ]*$)(?=(?:[^0-9]*[0-9]){16}[^0-9]*$)[0-9- ]+$

请参阅regex demo at regex101.com

或者,第一个空格检查正向先行可以用反向逻辑替换为负向:

^(?!(?:[^ ]* ){4})(?=(?:[^0-9]*[0-9]){16}[^0-9]*$)[0-9- ]+$

请参阅another demo

两个正则表达式都是以principle of contrast编写的,以便在前瞻模式不匹配时更快地使正则表达式失败。

<强>详情:

  • ^ - 字符串开头
  • (?!(?:[^ ]* ){4}) - 如果在当前位置右侧紧接着有4个序列,则表示未通过匹配的否定前瞻:
    • [^ ]* - 0 +字符以外的字符
    • - 空格
  • (?=(?:[^0-9]*[0-9]){16}[^0-9]*$) - 一个积极的前瞻,要求整个字符串应包含16个0+非数字序列([^0-9]*),后跟1位数字,然后是0 +字符,而不是数字到字符串的结尾
  • [0-9- ]+ - 匹配1位数字,-或空格
  • 的字符
  • $ - 字符串结束。