regex - SSN 中没有重复序列(例如 123-12-3123)

标签 regex regex-negation

如何通过正则表达式排除 SSN 的重复序列?

例如,不允许使用以下值:

    123-12-3123
    456-45-6456
    789-78-9789

更新

What constitutes repeating? *Does* 121-233-4444 count?

好问题,但是不行;至少现在还没有。我是填写 A&D 请求的代码猴子,而 A&D 反过来又满足客户的请求。

他们特别要求修复,以防止用户输入重复 3 次的 3 个数字的序列。最常见的是上面列出的那些。

What language are you using?

JavaScript

此外,我将此正则表达式附加到深埋在拥有数千名用户的企业级应用程序中的现有正则表达式上。添加代码是可能的,但完全不可取。

最佳答案

你的问题不清楚。我假设您想要 xyz-xy-zxyz 其中 x+1 = yy+1 = z

没有好的答案。

暴力破解:

/
   ^
   (?: 012-01-2012
   |   123-12-3123
   |   234-23-4234
   |   345-34-5345
   |   456-45-6456
   |   567-56-7567
   |   678-67-8678
   |   789-78-9789
   )
   \z
/x

上面可以动态构建:

my @alts;
for (0..7) {
   my ($x, $y, $z) = ($_+0, $_+1, $_+2);
   push @alts, "$x$y$z-$x$y-$z$x$y$z";
}

my $alt = join('|', @alts);

/^(?:$alt)\z/

无需验证,因此可以使用:

/
   ^
   (?: 01-?2-? | 12-?3-? | 23-?4-? | 34-?5-?
   |   45-?6-? | 56-?7-? | 67-?8-? | 78-?9-?
   ){3}
   \z
/x

如果您的编程语言可以选择嵌入代码:

/
   ^
   ( [0-7] )
   ( (??{ $1+1 }) )
   ( (??{ $1+2 }) )
   -
   \1 \2
   -
   \3 \1 \2 \3
   \z
/x

你可以扩大你的网络:

/
   ^
   ( [0-9] )( [0-9] )( [0-9] )
   -
   \1 \2
   -
   \3 \1 \2 \3
   \z
/x

如果您不想扩大网络,您也可以使用正则表达式之外的代码:

/
   ^
   ( [0-7] )
   ( [1-8] )
   ( [1-9] )
   -
   \1 \2
   -
   \3 \1 \2 \3
   \z
/x && $2 == $1+1 && $3 == $2+1

然后是这样的:

s/-//g;
/
   ^
   (?: 012 | 123 | 234 | 345
   |   456 | 567 | 678 | 789
   ){3}
   \z
/x

为了简单起见,我强烈建议您在进行检查之前删除非数字。

/^[0-9]{3}-[0-9]{2}-[0-9]{4}\z/
   or die;

s/-//g;

... check here...

关于regex - SSN 中没有重复序列(例如 123-12-3123),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5795079/

相关文章:

python - 删除两个句号之间的数字

Javascript RegExp 仅用于特殊字符

仅当单词(url)不包含字符时才匹配单词(url)的正则表达式

python - Pandas 字符串匹配负前瞻不起作用

css - 确保 Netbeans 中 CSS 中的每个冒号后恰好有一个空格

python - 在 Notepad++ 中的匹配模式之前添加具有特定模式的新行

Javascript 正则表达式在数学方程式中查找变量

php - preg_match 排除一个数字

regex - 正则表达式中单词的插入符/否定

javascript - 使用某些正则表达式模式时,为什么我的函数不能正确替换