8

我正在尝试在 javascript 中为英国银行排序代码创建一个正则表达式,以便用户可以输入 6 位数字或 6 位数字,并在对之间使用连字符。例如“123456”或“12-34-56”。也不是所有的数字都可以是 0。到目前为止,我已经有了/(?!0{2}(-?0{2}){2})(\d{2}(-\d{2}){2})|(\d{6})/这个jsFiddle 来测试。

这是我的第一个正则表达式,所以我不确定我做对了。6 0 位数字的测试应该失败,我认为-?前瞻中的可选连字符会导致它与 6 0 位带连字符的数字相同,但事实并非如此。如果我做的完全不正确,我会很感激一些帮助和任何批评!

4

2 回答 2

11

只是为了回答您的问题,您可以通过以下方式验证用户输入:

/^(?!(?:0{6}|00-00-00))(?:\d{6}|\d\d-\d\d-\d\d)$/.test(inputString)

它将仅严格匹配表单中的输入XX-XX-XXXXXXXXwhere Xare numbers,并将排除 00-00-00以及000000任何其他情况(例如XX-XXXXXXXX-XX)。

但是,在我看来,正如其他评论中所述,我认为如果你强制用户要么总是输入连字符,要么根本不输入连字符会更好。在处理与金钱有关的任何事情时格外严格可以节省(未知)以后的麻烦。

于 2012-07-05T10:17:32.357 回答
4

Since any of the digits can be zero, but not all at once, you should treat the one case where they are all zero as a single, special case.

You are checking for two digits (\d{2}), then an optional hyphen (-?), then another two digits (\d{2}) and another optional hyphen (-?), before another two digits (\d{2}).

Putting this together gives \d{2}-?\d{2}-?\d{2}, but you can simplify this further:

(\d{2}-?){2}\d{2}

You then use the following pseudocode to match the format but not 000000 or 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

You may wish to add the string anchors ^ (start) and $ (end) to check the entire string.

于 2012-07-05T10:12:19.737 回答