匹配含最多2个空格的12位数字序列的正则表达式需求
匹配12位数字且最多含2个空格的正则表达式
需求很明确:要匹配由恰好12个数字组成的序列,数字之间最多可以插入2个空格(不管是单个间隔里的2个连续空格,还是两个间隔各1个空格),绝对不能包含换行符,而且序列首尾必须是数字。
有效示例
3345624 90812(7位数字+1个空格+5位数字)908 7865123 23(3位+1空格+7位+1空格+2位,总空格数2)908765312334(无空格,纯12位数字)90878903556 1(11位+1空格+1位)67555123452 5(11位+2空格+1位)
原表达式的问题
你提到的 /[0-9|\s]{12,14}/ 完全满足不了需求,问题出在这几点:
- 用了
\s,会匹配换行符,不符合要求 - 允许序列开头或结尾是空格,比如
" 123456789012"这种无效内容也会被匹配 - 没限制数字总数,比如10个数字加4个空格(总长度14)也会被放行,但数字数量根本不够12
- 管不住空格的数量和位置,比如多个间隔的空格只要总长度在12-14之间就会被匹配,比如
"1 2 34567890"(10个数字+3个空格)这种完全不符合的也能通过
正确的正则表达式
这里给两个靠谱的版本:
版本一(严格限制首尾为数字)
^\d(?=(?:\D*\d){11}$)[0-9 ]{11,13}\d$
版本二(更简洁,依赖预查控制数字数量)
^(?=(?:\D*\d){12}$)[0-9 ]{12,14}$
表达式解释
^和$:锚定字符串的开头和结尾,确保我们匹配的是整个序列,不是其中一段(?=(?:\D*\d){12}$):正向预查,强制整个序列里必须恰好有12个数字(\D*\d表示“任意非数字字符+一个数字”,重复12次就保证了数字总数)[0-9 ]{12,14}:匹配由数字和空格组成的12到14个字符(12个数字加上0-2个空格,刚好是这个长度范围)- 版本一里的
^\d和\d$额外锁死首尾必须是数字,彻底杜绝空格出现在两端的情况
验证效果
这两个表达式能匹配所有你给出的有效示例,同时会拒绝以下无效情况:
- 首尾带空格的序列
- 数字数量不足12的序列
- 空格总数超过2的序列
- 包含换行符的序列
内容的提问来源于stack exchange,提问作者Artem
相关产品推荐
相关产品推荐

