【问题标题】:Regex for MasterCard万事达卡的正则表达式
【发布时间】:2016-06-11 21:08:02
【问题描述】:

我发现以下信用卡类型 MasterCard 的正则表达式

public static readonly string CreditMasterCard = @"^(5[1 - 5][0 - 9]{14})$";

然后我写了以下代码:

Regex regexMasterCard = new Regex(CommonLibrary.RegexCreditCardStrings.CreditMasterCard);

if (regexMasterCard.IsMatch(number)) return CommonLibrary.CreditCardType.mastercard;

但是当我设置 number='5308171154251187' 时,它是错误的。正则表达式中有什么不正确的地方?

【问题讨论】:

  • 删除模式中的空格
  • 这是为了取代对 Luhn 算法的检查吗?
  • @Mathemats,不,只是客户端验证

标签: c# .net regex credit-card


【解决方案1】:

您只需要删除字符类中的空格:

^5[1-5][0-9]{14}$

这些空格在字符类中总是有意义的(即使您指定了RegexOptions.IgnorePatternWhitespace 标志),并且在您的情况下,它们创建的范围是从一个空格到另一个空格,而不是从 1 到 5 和 0 到 9 位。此外,外括号中不需要,您不需要捕获整个模式(您始终可以使用$0 反向引用或match.Value 引用整个匹配项)。

请参阅regex demo

根据@saj 评论,您现在可以使用

^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$

regex demo

详情

  • ^ - 字符串开头
  • (?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720) - 任何选择:
    • 5[1-5][0-9]{2} - 515 和任意 2 位数字(51005599
    • 222[1-9] - 22212229
    • 22[3-9][0-9] - 22302299
    • 2[3-6][0-9]{2} - 2,然后是 36 和任意 2 位数字(23002699
    • 27[01][0-9] - 2700 直到 2719
    • 2720 - 2720
  • [0-9]{12} - 任意 12 位数字
  • $ - 字符串结束。

【讨论】:

  • 万事达卡现在从 2221 到 2720 开始。所有数字都有 16 位。所以使用这个正则表达式,^(?:5[1-5][0-9]{2}|222[1- 9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12} $
  • 您可以通过将所有[0-9] 替换为\d -s 来缩短正则表达式。
  • @AndresEhrenpreis I am not sure it is a good idea.
猜你喜欢
  • 2013-01-13
  • 2020-03-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多