我需要检查字符串是否包含0到3个空格和16个数字。我怎样才能做到这一点 ?我想出的只是检查总和
^[0-9- ]{16,19}$
答案 0 :(得分:2)
您可以根据前瞻使用此正则表达式:
^[0-9](?!(?:[0-9]* ){4})(?=(?: *[0-9]){15}$)[0-9- ]+[0-9]$
^[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位数字,-
或空格$
- 字符串结束。