正则表达式求助:基于首位数字条件校验第二位数字的实现
正则校验实现方案
不需要嵌套复杂的前瞻、后顾逻辑,直接通过多选分支并列三种互斥的合法组合即可,表达式可读性和维护性更高,完整正则如下:
/^(0[1379]|1(?:5|10)|2[02468])$/
表达式逻辑说明
^锚定字符串起始位置,避免匹配到字符串中间的无关片段- 三个分支通过
|分隔,分别对应第一位为0、1、2时的合法规则:0[1379]:第一位为0时,第二位必须是1、3、7、9中的奇数1(?:5|10):第一位为1时,后续内容为5或者10(注:单个数字位取值范围为0-9,此处按你给出的规则原文编写,如果“10”为笔误、实际要求第二位为0或5,将该段替换为1[05]即可)2[02468]:第一位为2时,第二位必须是0、2、4、6、8中的偶数
$锚定字符串结束位置,避免字符串末尾多余字符漏过校验(?:)为非捕获组,仅做逻辑分组不保存匹配内容,性能优于普通捕获组
沿用前瞻/后顾写法的实现
如果你需要保持之前使用后顾语法的编写思路,补全剩余两个分支的后顾判断即可,对应正则如下:
/^[012]((?<=0)[1379]|(?<=1)(?:5|10)|(?<=2)[02468])$/
该写法逻辑和分支写法完全一致,先匹配第一位的合法取值[012],再通过后顾判断当前第一位的具体值,匹配对应要求的后续内容。
匹配效果参考
- 合法可匹配:
01、03、07、09、15、110、20、24、28 - 非法不可匹配:
00、02、11、12、21、23、30、0a、151
内容的提问来源于stack exchange,提问作者Mopparthy Ravindranath
相关产品推荐
相关产品推荐

