MasterCard的正则表达式

Ole*_* Sh 3 .net c# regex credit-card

我找到了以下信用卡类型万事达卡的正则表达式

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

然后我写了下面的代码:

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

if (regexMasterCard.IsMatch(number)) return CommonLibrary.CreditCardType.mastercard;
Run Code Online (Sandbox Code Playgroud)

但是当我设置number ='5308171154251187'时就错了.正则表达式中有什么不正确?

Wik*_*żew 6

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

^5[1-5][0-9]{14}$
Run Code Online (Sandbox Code Playgroud)

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

请参阅正则表达式演示.

根据@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}$
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示

细节:

  • ^ - 字符串的开头
  • (?: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}- 5,a 15和任意2位数5100到(5599)
    • 222[1-9]- 22212229
    • 22[3-9][0-9]- 22302299
    • 2[3-6][0-9]{2}- 2,然后36和任何2位数(2300直到2699)
    • 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} $ (3认同)
  • @AndresEhrenpreis [我不确定这是一个好主意](/sf/answers/1163524491/)。 (2认同)