如何编写符合全名校验双规则的单条正则表达式
单正则合并校验方案
完全可以把两条独立校验的正则合并为单条,实现完全一致的校验效果,不需要拆分两次匹配。
最终可用正则
^(?!.*([a-zA-Z])\1\1)[a-zA-Z]+( [a-zA-Z]+)+$
各部分作用拆解
- 开头的
(?!.*([a-zA-Z])\1\1)是负向先行断言,属于预校验逻辑,不会实际消耗匹配的字符:它会从字符串开头扫描全串,只要任意位置出现连续3个相同的英文字母,就直接判定匹配失败,完全覆盖原来第二条正则的校验规则。 - 后半段
[a-zA-Z]+( [a-zA-Z]+)+$完全复用原有第一条规则的匹配逻辑:保证整个字符串仅由英文字母组成的字段构成,字段之间只能用单个空格分隔,且至少有2个字段,从根本上避免连续空格、首尾带空格、只有单个姓名段的非法情况。
校验效果对齐验证
和原双正则分开校验的结果完全一致:
- 允许通过的场景
James Mary:无连续三个相同字母,两个字段用单个空格分隔,正常通过James Smith Murphy:三个字段单空格分隔,无三连重复字母,正常通过
- 拦截的非法场景
James Maryyy:末尾存在连续3个y,触发预校验拦截,匹配失败James:仅单个姓名字段,不满足字段数量要求,匹配失败
这个合并写法和原双正则的校验逻辑100%对齐,因为预校验在匹配起始阶段就会完成非法内容拦截,实际运行效率和拆分两次匹配的方案基本没有差距,不会有额外性能损耗。
内容的提问来源于stack exchange,提问作者Denis Padua
相关产品推荐
相关产品推荐

