如何使用Regex校验5位数字,限制重复字符不超过2位且排除12345/54321序列
5位数字校验正则调整方案
最终可直接使用的正则
JavaScript代码写法如下:
// 正则字面量写法 var PASSWORD_PATTERN = /^(?![\d]*(\d)\1{2})(?!12345)(?!54321)\d{5}$/ // 字符串写法(注意转义反斜杠) var PASSWORD_PATTERN = "^(?![\\d]*(\\d)\\1{2})(?!12345)(?!54321)\\d{5}$"
规则说明
- 整体用
^和$包裹,严格匹配整个输入内容,避免部分匹配的问题 \d{5}限定输入必须为恰好5位纯数字,排除非数字字符、长度不符的输入(?![\d]*(\d)\1{2})负向先行断言:禁止出现任意3个连续相同的数字,满足相同数字连续重复次数不超过2次的要求,11234这类2次连续重复的内容可正常通过校验(?!12345)(?!54321)两个负向先行断言:直接拦截12345、54321两种连续序列的输入
原正则存在的问题
你之前写的正则不符合需求的核心原因如下:
- 包含
(?=[\D]*\d)规则,允许非数字字符存在,和5位纯数字的校验需求冲突 (?!.*(\d)\1)规则直接禁止了所有2次连续重复的数字,和你允许11234这类格式的要求矛盾- 未添加针对
12345、54321两种序列的拦截规则
校验效果测试
合法输入示例
- 11234:2次连续重复数字,无特殊序列,校验通过
- 12134:无连续重复超2次,无特殊序列,校验通过
- 12233:多组2次连续重复数字,无特殊序列,校验通过
- 54322:非完全降序序列,校验通过
非法输入示例
- 11123:3次连续重复数字,校验不通过
- 12345:连续升序序列,校验不通过
- 54321:连续降序序列,校验不通过
- 1234a:包含非数字字符,校验不通过
- 1234:长度仅4位,校验不通过
内容的提问来源于stack exchange,提问作者drak2000
相关产品推荐
相关产品推荐

