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

时间:2011-04-26 18:54:37

标签: regex regex-negation

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

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

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

更新

  

什么构成重复? * *    121-233-4444算?

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

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

  

您使用的是哪种语言?

的javascript

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

2 个答案:

答案 0 :(得分:3)

你的问题不明确。我假设您希望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...

答案 1 :(得分:0)

首先删除非数字:

$ssn =~ s/\D+//g;

然后检查重复的三位数组:

if ($ssn =~ /(\d{3})\1\1/) {
  print "ssn has repeating digits: $1\n";
}