我正在尝试在javascript中为英国银行排序代码创建正则表达式,以便用户可以在对之间输入6位数字或带有连字符的6位数字。例如“123456”或“12-34-56”。也不是所有的数字都可以是0。
到目前为止,我已经/(?!0{2}(-?0{2}){2})(\d{2}(-\d{2}){2})|(\d{6})/
和jsFiddle to test.
这是我的第一个正则表达式,所以我不确定我做得对。对6个0位数的测试应该会失败,我认为前瞻中的-?
可选连字符会使它与带有连字符的6个0位数相同,但事实并非如此。
如果我做错了,我会感激一些帮助和任何批评!
答案 0 :(得分:8)
只是回答您的问题,您可以通过以下方式验证用户输入:
/^(?!(?:0{6}|00-00-00))(?:\d{6}|\d\d-\d\d-\d\d)$/.test(inputString)
它将严格匹配XX-XX-XX
或XXXXXX
形式的输入,其中X
为数字, 排除 { {1}},00-00-00
以及任何其他情况(例如000000
或XX-XXXX
)。
但是,在我看来,正如其他评论中所述,我认为如果强制用户要么总是输入连字符,要么根本不输入连字符,这样做会更好。在处理与金钱有关的任何事情时要特别严格,以后会挽救(未知)麻烦。
答案 1 :(得分:4)
由于任何数字都可以为零,但不是一次全部,因此您应该将它们全部为零的一种情况视为一个特殊情况。
您正在检查两个数字(\d{2}
),然后是可选的连字符(-?
),然后是另外两个数字(\d{2}
)和另一个可选的连字符(-?
),在另外两位数之前(\d{2}
)。
将这些放在一起会产生\d{2}-?\d{2}-?\d{2}
,但您可以进一步简化:
(\d{2}-?){2}\d{2}
然后使用以下伪代码匹配格式,但不是000000
或00-00-00
:
if (string.match("/(\d{2}-?){2}\d{2}/") && !string.match("/(00-?){2}00/"))
//then it's a valid code, you could also use (0{2}-?){2}0{2} to check zeros
您可能希望添加字符串锚点^
(开始)和$
(结束)来检查整个字符串。