如何修改regex以拦截连续相同特殊字符,满足姓名合规校验要求?
正则修改方案
问题原因
你现有正则未限制允许类特殊字符的连续重复规则,因此无法拦截连续两个’、连续两个-这类非法格式。
修改后正则
版本1(支持多语言姓名,推荐现代正则引擎使用)
^(?!.*([^\p{L}\s])\1)[\p{L}'’\-,.][^0-9_!¡?÷?¿\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
版本2(兼容老旧引擎/中文姓名,适配不支持Unicode属性类的环境)
^(?!.*([^a-zA-Z\u4e00-\u9fa5\s])\1)[a-zA-Z\u4e00-\u9fa5'’\-,.][^0-9_!¡?÷?¿\\+=@#$%ˆ&*(){}|~<>;:[\]]{2,}$
核心修改说明
- 新增负向前瞻断言
(?!.*([^\p{L}\s])\1),作用是全局拦截连续重复的非字母、非空白字符:[^\p{L}\s]匹配所有不属于字母、不属于空格的字符(包含你允许的’、-、,、.等特殊字符)\1指代前一个括号匹配到的字符,([^\p{L}\s])\1就代表两个连续相同的特殊字符- 只要字符串中存在上述连续重复特殊字符,正则直接匹配失败
- 补充了右单引号
’到允许的首字符集里,适配你示例中出现的排版类撇号格式,如果你只需要支持直引号'可删掉这部分 - 原有正则的字符过滤、长度限制逻辑完全保留,不影响已经验证通过的合法姓名校验
校验效果确认
- 所有你列出的合法姓名格式均可正常通过校验
- 此前失效的
Timmy O’’Shaughnessy、John O’Shaughnessy--Smith两类格式会被直接拦截 - 带数字、注入代码类的非法格式仍按原有规则正常拦截
内容的提问来源于stack exchange,提问作者Ali Khabib
相关产品推荐
相关产品推荐

