当前位置: 首页 > 知识库问答 >
问题:

不含所有连续数的SSN的正则表达式

缪远
2023-03-14

我正在使用以下规则为SSN开发正则表达式。我已经成功地应用了除#7之外的所有匹配规则。有人可以帮助更改此表达式以包括最后一个规则#7吗:

^((?!000|666)[0-8][0-9]{2}-(?!00)[0-9]{2}-(?!0000)[0-9]{4}$|(?!000|666)[0-8][0-9]{2}(?!00)[0-9]{2}(?!0000)[0-9]{4}$)
  1. 连字符应该是可选的(这在上面通过使用带有OR的2个表达式来处理
  2. 不能以000开头
  3. 不能以666开头
  4. 不能以900-999开头
  5. 中间位数不能是00
  6. 最后四位数字不能0000
  7. 不能都是相同的数字ex:111-11-1111或111111111

共有2个答案

扈运浩
2023-03-14

首先,让我们缩短模式,因为它包含两个几乎相同的替代方案,一个匹配带连字符的SSN,另一个匹配不带连字符的SSN编号。您可以使用^x(-)模式,而不是^(x-y-z$|xyz$)模式y\1z$模式,因此您的正则表达式可以减少到^(?000 | 666)[0-8][0-9]{2}(-?)(?!00)[0-9]{2}\1(?0000)[0-9]{4}$,请参阅此处的正则表达式演示。

要使模式永远不匹配仅包含相同数字的字符串,您可以在^之后添加以下负前瞻:

(?!\D*(\d)(?:\D*\1)*\D*$)

如果有,比赛就会失败

  • \D*-零个或多个非数字
  • (\d)-一个数字(在组1中捕获)
  • (?:\D*\1)*-任何零个或多个非数字的零次或多次出现,然后是与第1组中相同的数字,然后是
  • \D*$-零个或多个非数字,直到字符串结束

现在,由于我建议将正则表达式缩短为具有反向引用的模式,因此在添加这个前瞻之后,您必须调整反向引用。

因此,您的解决方案看起来像

^(?!\D*(\d)(?:\D*\1)*\D*$)(?!000|666)[0-8]\d{2}(-?)(?!00)\d{2}\2(?!0000)\d{4}$
^(?![^0-9]*([0-9])(?:[^0-9]*\1)*[^0-9]*$)(?!000|666)[0-8][0-9]{2}(-?)(?!00)[0-9]{2}\2(?!0000)[0-9]{4}$

注意模式中没有前瞻的\1变成了\2,因为(-?) 变成了Group 2。

请参阅正则表达式演示。

还请注意,在某些正则表达式中,d不等于[0-9]。

吴鸿彩
2023-03-14

添加以下锚定到开始的负前瞻:

^(?!(.)(\1|-)+$)

观看现场演示。

这将捕获第一个字符,然后断言其余输入不是由捕获的字符或连字符组成。

整个正则表达式可以缩短为:

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

观看现场演示。

不必重复带连字符和不带连字符的正则表达式的主要技巧是捕获可选连字符(作为第3组),然后使用反向引用在下一个位置捕获,因此两者都存在或都不存在。

 类似资料:
  • 问题内容: 该字符串不应包含SSN或电话号码。下面的正则表达式不起作用,它仅接受xxxxxxxxx格式。 不应包含或或。 问题答案: 您可以尝试: 解释一下,如果我们阅读了您提供的查询: 我们可以读到:( 在我的顶部版本中,我改写为:。)。 保证世界上任何字符串都不匹配其中至少两个,因此它们的组合始终为真,从而为您提供了一个简单得多的有效正则表达式: 是零宽度的断言,因此它不消耗任何东西。即使匹配

  • 我发现正则表达式不包含101,如下所示: 0*1*0*(1 00 000)*(010)* 我无法理解作者是如何想出这个正则表达式的。所以我只想到了不包含101的字符串: 01000100 我似乎上面的字符串不会与上面的正则表达式匹配。但我不确定。所以尝试在regex101.com上翻译成等效的pcre正则表达式,但也失败了(因为可以看到我的正则表达式甚至不匹配包含单个1的字符串。 我的翻译有什么问

  • 问题内容: 我知道通过使用Xeger,我们可以获得指定模式的随机值。 我想知道是否有一种方法可以返回指定正则表达式的所有有效字符串。例如,对于模式:,我们可以得到所有的值来。 谢谢 编辑: 在这里,我们不考虑+和*等无限输出;我们如何获得有限正则表达式的所有值? 最后编辑: 感谢大家!最后,我不会考虑所有可能的值,因为可能有数千个。我限制一个特定的数字作为减少数量的值的数量。 问题答案: 由于正则

  • 我需要一些“包含”和“不包含”的正则表达式。通常我会写: 包含:(.*WORD_A.*)$,不包含:(^((?!WORD_A.*)*)$ 如果单独使用,这很好,但我想写一些可以检测到的东西,比如“包含单词A和单词B”(顺序不相关!)和“包含单词A,但不包含单词B)。 基本上,我希望用户可以做出这样的声明“以单词a开头,包含单词B,但不是C和/或以D结尾”,程序返回真/假。最好的办法是只附加正则表达

  • 问题内容: 我有此RequestMapping: 我想添加该RequestMapping: 因此,它可以服务于所有“无出发”路线。但是,这会产生冲突,因为“ / route / to-destination-from-departure” URL实际上也与第二个RequestMapping匹配…很公平,所以我的解决方案是指定一个正则表达式: 因此,如果“目标”包含“ -from-”,则Reques

  • 我试图在java中找到一个正则表达式,它可以提取句子中的连续词对,如下面的示例所示。 输入:word1 word2 word3 word4。。。。 输出: 文字1文字2 等... 知道怎么做吗?