【问题标题】:UK bank sort code javascript regular expression英国银行排序代码javascript正则表达式
【发布时间】:2012-07-05 09:58:50
【问题描述】:

我正在尝试在 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
  • 对不起,没关系 - 它不能全为零
  • 您可以要求用户不要在号码中包含连字符-,如在线VISA/万事达卡支付。与金钱打交道时,格外严格是可以的。
  • 是的,我宁愿完全没有连字符,但不幸的是必须同时容纳两者

标签: javascript regex bank


【解决方案1】:

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

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

它将仅严格匹配XX-XX-XXXXXXXX 形式的输入,其中X 是数字,并且将排除 00-00-00000000以及任何其他情况(例如 XX-XXXXXXXX-XX)。

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

【讨论】:

  • @ScottS:如果有什么问题,如果帖子是新的,请发表评论。我在这里编辑它。
  • 我认为根据这个jsfiddle.net/sd88a/2 它不适用于带有连字符的 6 个非 0 数字
  • @nhahtdh 好的,我刚刚修复了正则表达式,将{2} 添加到(\d{6}|(\d{2}-)\d{2}) 以使其成为(\d{6}|(\d{2}-){2}\d{2})。 @NickL 这是您遇到的问题。
  • 为那些家伙干杯,我同意只允许数字,但不幸的是要处理一些遗留应用程序,所以必须做好准备
  • @NickL 编辑了我的帖子以完成用例。
【解决方案2】:

由于任何数字都可以为零,但不能同时为零,因此您应该将它们全为零的情况视为一种特殊情况。

您正在检查两位数字 (\d{2}),然后是可选连字符 (-?),然后是另外两位数字 (\d{2}) 和另一个可选连字符 (-?),然后是另外两位数字 (@ 987654325@)。

把它放在一起得到\d{2}-?\d{2}-?\d{2},但你可以进一步简化:

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

然后您使用以下伪代码匹配格式,但不匹配 00000000-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

您可能希望添加字符串锚点^(开始)和$(结束)来检查整个字符串。

【讨论】:

  • 您的正则表达式将匹配 45-5454,不确定这是否允许,因为 OP 说要么没有连字符,要么成对之间没有连字符。
  • @nhahtdh 但接受这一点比将所有东西都变成一个完美的 RE 所需的扭曲要小。接受后最好通过删除连字符进行标准化(此时,45-4545 无关紧要)。
  • @DonalFellows:可以将所有内容放入单个正则表达式中,使用 Javascript 支持的内容(负前瞻)。我认为网上银行通过强制输入信用卡号码的单一方式做得对 - 无需输入规范化,只需严格检查。用户将无法抱怨任何事情,因为只有一种输入方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多