如何修改正则表达式以校验密码中数字之和等于指定值?
如何修改正则表达式使密码中所有数字之和等于指定值(如10)
首先明确:正则表达式并非处理数值计算的最优工具,但如果一定要用正则实现“数字和等于指定值”的校验,可以通过枚举所有可能的数字组合(允许数字之间穿插任意非数字字符)来构建规则。
针对你需要的“数字和为10”的需求,修改后的正则表达式如下:
^(?=.*\d)(?=(?:\D*(?:10|01|28|82|37|73|46|64|55|19|91|27|72|36|63|45|54|118|181|811|127|172|217|271|712|721|136|163|316|361|613|631|145|154|415|451|514|541|226|262|622|235|253|325|352|523|532|244|424|442|334|343|433|1117|1171|1711|7111|1126|1162|1216|1261|1612|1621|2116|2161|2611|6112|6121|6211|1135|1153|1315|1351|1513|1531|3115|3151|3511|5113|5131|5311|1144|1414|1441|4114|4141|4411|1225|1252|1522|2125|2152|2215|2251|2512|2521|5122|5212|5221|1234|1243|1324|1342|1423|1432|2134|2143|2314|2341|2413|2431|3124|3142|3214|3241|3412|3421|4123|4132|4213|4231|4312|4321|2224|2242|2422|4222|2233|2323|2332|3223|3232|3322|11116|11161|11611|16111|61111|11125|11152|11215|11251|11512|11521|12115|12151|12511|15112|15121|15211|21115|21151|21511|25111|51112|51121|51211|52111|11134|11143|11314|11341|11413|11431|13114|13141|13411|14113|14131|14311|31114|31141|31411|34111|41113|41131|41311|43111|11224|11242|11422|12124|12142|12214|12241|12412|12421|14122|14212|14221|21124|21142|21214|21241|21412|21421|22114|22141|22411|24112|24121|24211|41122|41212|41221|42112|42121|42211|11233|11323|11332|12133|12313|12331|13123|13132|13213|13231|13312|13321|21133|21313|21331|23113|23131|23311|31123|31132|31213|31231|31312|31321|32113|32131|32311|33112|33121|33211|12223|12232|12322|13222|21223|21232|21322|22123|22132|22312|22321|23122|23212|23221|31222|32122|32212|32221|111115|111151|111511|115111|151111|511111|111124|111142|111214|111241|111412|111421|112114|112141|112411|114112|114121|114211|121114|121141|121411|124111|141112|141121|141211|142111|211114|211141|211411|214111|241111|411112|411121|411211|412111|421111|111133|111313|111331|113113|113131|113311|131113|131131|131311|133111|311113|311131|311311|313111|331111|111223|111232|111322|112123|112132|112213|112231|112312|112321|113122|113212|113221|121123|121132|121213|121231|121312|121321|122113|122131|122311|123112|123121|123211|131122|131212|131221|132112|132121|132211|211123|211132|211213|211231|211312|211321|212113|212131|212311|213112|213121|213211|221113|221131|221311|223111|231112|231121|231211|232111|311122|311212|311221|312112|312121|312211|321112|321121|321211|322111|112222|121222|122122|122212|122221|211222|212122|212212|212221|221122|221212|221221|222112|222121|222211|1111114|1111141|1111411|1114111|1141111|1411111|4111111|1111123|1111132|1111213|1111231|1111312|1111321|1112113|1112131|1112311|1113112|1113121|1113211|1121113|1121131|1121311|1123111|1131112|1131121|1131211|1132111|1211113|1211131|1211311|1213111|1231111|1311112|1311121|1311211|1312111|1321111|2111113|2111131|2111311|2113111|2131111|2311111|3111112|3111121|3111211|3112111|3121111|3211111|1111222|1112122|1112212|1112221|1121122|1121212|1121221|1122112|1122121|1122211|1211122|1211212|1211221|1212112|1212121|1212211|1221112|1221121|1221211|1222111|2111122|2111212|2111221|2112112|2112121|2112211|2121112|2121121|2121211|2122111|2211112|2211121|2211211|2212111|2221111|11111113|11111131|11111311|11113111|11131111|11311111|13111111|31111111|11111122|11111212|11111221|11112112|11112121|11112211|11121112|11121121|11121211|11122111|11211112|11211121|11211211|11212111|11221111|12111112|12111121|12111211|12112111|12121111|12211111|21111112|21111121|21111211|21112111|21121111|21211111|22111111|111111112|111111121|111111211|111112111|111121111|111211111|112111111|121111111|211111111|1111111111))\D*$).{6,}$
规则解释
^和$:锚定字符串的首尾,确保校验覆盖整个密码。(?=.*\d):保留原正则的逻辑,确保密码至少包含一个数字。(?=(?:\D*(?:...))\D*$):核心预查规则,枚举所有加和为10的数字组合,\D*允许数字之间穿插任意非数字字符。.{6,}:确保密码长度至少为6位。
实际开发建议
这种枚举式的正则会随着目标和值的增大变得异常冗长(比如和为20时,组合数量会爆炸),维护成本极高。更合理的做法是:
- 用原正则校验密码的基础规则(长度、包含数字等);
- 在代码中提取密码里的所有数字,计算它们的总和,再判断是否等于指定值。
比如用JavaScript实现:
function checkPasswordSum(password, targetSum) { // 先校验基础规则 if (!/^(?=.*[0-9]).{6,}$/.test(password)) return false; // 提取所有数字并求和 const digits = password.match(/\d/g) || []; const sum = digits.reduce((acc, num) => acc + parseInt(num), 0); return sum === targetSum; } // 测试示例 console.log(checkPasswordSum("dhbqdw46", 10)); // true console.log(checkPasswordSum("jwhf1ejhjh0", 10)); // false
内容的提问来源于stack exchange,提问作者Akshay
相关产品推荐
相关产品推荐

