你如何通过正则表达式排除SSN的重复序列?
例如,不允许使用以下值:
123-12-3123
456-45-6456
789-78-9789
更新
什么构成重复? * * 121-233-4444算?
好问题,但不是;至少还没有。我是代码猴填写A& D的请求,而A& D反过来正在履行客户的请求。
他们特别要求修复以防止用户输入重复3次的3个数字的序列。最常见的是上面列出的那些。
您使用的是哪种语言?
的javascript
此外,我将此正则表达式附加到现有的REGEX上,该REGEX深埋在具有数千个用户的企业级应用程序中。添加代码是可能的,但根本不可取。
答案 0 :(得分:3)
你的问题不明确。我假设您希望xyz-xy-zxyz
位于x+1 = y
和y+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";
}