匹配CLI自定义字符集生成字符串的正则表达式编写问题求助
你的正则表达式存在的问题如下
- 无法识别非连续的重复字符:你当前写的重复校验规则
(?!.*([chars])\1{1})只能匹配连续重复的字符(比如aa),对于间隔出现的重复字符(比如aba里的a)完全无法识别,正确的全局无重复校验逻辑应该是^(?!.*(.).*\1),可以匹配任意位置出现两次的相同字符。 - 重复校验逻辑完全冗余:你分别针对合并字符集、三个分组写了四个重复校验规则,实际上全局的无重复校验已经覆盖了所有分组内的重复校验场景,不需要拆分写多份。
- 字符集写法冗余:你在字符类中重复写入了
abc、1、2等重复字符,字符类中的重复字符会被自动去重,没有实际作用,示例场景下去重后的允许字符集应为[abcAB1234@#$%]。 - 完全缺失覆盖规则的校验逻辑:你当前的正则没有实现「覆盖指定字符/每个分组至少一个字符」的校验,仅写了无依据的
{8,}长度限制。如果要求覆盖所有允许的字符,因为字符不能重复,字符串长度必须等于去重后允许字符的总数量(当前示例为13),同时还要补充每个字符至少出现一次的预查;如果要求覆盖每个分组至少一个字符,需要补充三个预查分别校验每个分组的字符至少出现一次。 - 语法冗余:
\1{1}的写法完全没有必要,\1本身就代表匹配第一个捕获组的1次内容,不需要额外加{1}限定符。
示例场景下的修正正则参考
如果要求为:字符不重复、所有字符属于允许集、每个分组至少覆盖1个字符,修正后正则为:
^(?!.*(.).*\1)(?=.*[abc])(?=.*[abcAB1234])(?=.*[@#1$2%])[abcAB1234@#$%]+$
如果要求为:字符不重复、所有字符属于允许集、覆盖全部允许的13个字符,修正后正则为:
^(?!.*(.).*\1)(?=.*a)(?=.*b)(?=.*c)(?=.*A)(?=.*B)(?=.*1)(?=.*2)(?=.*3)(?=.*4)(?=.*@)(?=.*#)(?=.*\$)(?=.*%)[abcAB1234@#$%]{13}$
内容的提问来源于stack exchange,提问作者Dennis A. Boanini
相关产品推荐
相关产品推荐

