我是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:
有效ID:aCe8999
答案 0 :(得分:1)
您的第一个正则表达式遇到了一些问题。重要的是它接受{{{{}}}}}
,这意味着您建立了错误的字符类。它还与123-45 6789
匹配(注意空格和破折号的混合)。
要在正则表达式中表示“或”,您需要使用管道|
,并记住每个符号都属于它所在的那一侧。因此,例如^1|2$
检查以1
开头或以2
结尾的字符串,不仅检查两个单独的输入字符串1
和2
。
要应用完全匹配,您需要执行^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