用于有效SSN或其他ID的正则表达式

时间:2019-02-22 16:34:10

标签: regex

我是regex新手,并且拥有适用于SSN的有效regex:

/^(\d{3}(\s|-)?\d{2}(\s|-)?\d{4})|[\d{9}]*$/

但是我现在需要扩展它以接受SSN或另一个7个字符的字母数字ID,如下所示:

/^[a-zA-Z0-9]{7}$/

我认为这就像将SSN分组并添加OR一样简单。但我的测试仍然失败。这就是我现在得到的:

/^((\d{3}(\s|-)?\d{2}(\s|-)?\d{4})|[\d{9}])|[a-zA-Z0-9]{7}$/

我在做什么错?还有一种更优雅的方式来表示SSN或我的其他ID吗?

感谢任何有用的提示。

有效的SSN:

  • 123-45-6789
  • 123456789
  • 123 45 6789

有效ID:aCe8999

2 个答案:

答案 0 :(得分:1)

您的第一个正则表达式遇到了一些问题。重要的是它接受{{{{}}}}},这意味着您建立了错误的字符类。它还与123-45 6789匹配(注意空格和破折号的混合)。

要在正则表达式中表示“或”,您需要使用管道|,并记住每个符号都属于它所在的那一侧。因此,例如^1|2$检查以1开头或以2结尾的字符串,不仅检查两个单独的输入字符串12

要应用完全匹配,您需要执行^1$|^2$^(1|2)$

使用第二个正则表达式^[a-zA-Z0-9]{7}$时,您并不是说 7个字符的字母数字ID ,而是说是数字,字母或字母数字。因此它也与1234567相匹配。如果这不是问题,则可以通过消除以下问题来解决以下正则表达式:

^\d{3}([ -]?)\d\d\1\d{4}$|^[a-zA-Z0-9]{7}$

答案 1 :(得分:1)

我也修改了您的第一个正则表达式,下面是演示程序。根据我对问题的理解。让我知道是否需要任何修改。

my @ids = (
    '123-45-6789',
    '123456789',
    '123 45 6789',
    '1234567893434',  # invalid
    '123456789wwsd',  # invalid
    'aCe8999',
    'aCe8999asa' # invalid
);

for (@ids) {
    say "match = $&" if $_ =~ /^ (?:\d{3} ([ \-])? \d{2} \1? \d{4})$ | ^[a-zA-Z0-9]{7}$/x ;
}

输出:

match = 123-45-6789
match = 123456789
match = 123 45 6789
match = aCe8999