You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写正则表达式禁止SSN出现9位完全相同数字(支持带/不带连字符)

问题原因拆解

你遇到的问题本质是三个正则语法使用错误:

  • 全相同带连字符的匹配规则写错
    你写的^(\d)\1{2}-(\d)\1{1}-(\d)\1{3}$逻辑错误:后续-后新捕获的(\d)生成了新的分组,你依然用第一个分组的反向引用\1做匹配,无法命中111-11-1111这类全相同的场景。正确的写法应该是全程复用第一个捕获的数字,即^(\d)\1{2}-\1{2}-\1{4}$。
  • 负向先行断言语法使用错误
    (?!...)是零宽度断言,仅校验当前位置后续的内容是否不符合规则,本身不会消耗任何字符。你写的^(?!(\d)\1{8})$只做了断言,没有定义需要匹配的字符格式,相当于要求“字符串开头到结尾之间没有任何字符,且不符合全相同9位数字规则”,自然无法匹配任何正常内容。正确的反转写法需要在断言后补充要匹配的格式,比如排除全相同9位无连字符数字的规则为^(?!(\d)\1{8}$)\d{9}$。
  • 多排除条件的逻辑错误
    你写的^(?!A)$|^(?!B)$逻辑等价于“不满足A 或者 不满足B”,任意内容都符合这个条件(没有内容能同时是A又是B),完全不符合“同时排除A和B”的需求。多个排除条件应该把负向断言并列放在开头,即^(?!A)(?!B)你的匹配规则$。

最终合并后的SSN校验正则

你原有可正常运行的SSN规则是带连字符格式,新增排除全相同数字的规则后,最终可用正则如下:

^(?!000|666|9\d\d)(?!(\d)\1{2}-\1{2}-\1{4}$)\d{3}-(?!00)\d\d-(?!0000)\d{4}$

如果你需要同时支持无连字符的SSN校验,只需调整格式匹配部分即可,核心排除逻辑保持不变。

内容的提问来源于stack exchange,提问作者NoobProgrammer3000

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:18:03