如何制作正则表达式来检测 rupay 借记卡

How to make regular expression to detect rupay debit card

Ru 支付卡以以下 16 位数字开头

  1. 60
  2. 6521
  3. 6522

那么如何匹配这种格式以获得类型,因为它是 rupay 类型的借记卡

我试过这个正则表达式

/^(((60)([0-9]{14}))|((6521)([0-9]{12}))|((6522)([0-9]{12})))$/

要匹配两个范围,您可以从第一个模式中排除 011,并从另一个模式中排除 521522

排除 011 卢比卡:

^6(?!011)(?:0[0-9]{14}|52[12][0-9]{12})$

说明

  • ^6 字符串开始并匹配 6
  • (?!011)断言011不在正对右边
  • (?:非捕获组
    • 0[0-9]{14}匹配一个0和14位数字
    • |
    • 52[12][0-9]{12}匹配521或522和12位数字
  • ) 关闭群组
  • $ 字符串结尾

Regex demo

从发现卡片中排除 521 和 522

^6(?!52[12])(?:011|5[0-9][0-9])[0-9]{12}$

说明

  • ^6 字符串开始并匹配 6
  • (?!52[12])断言521或522不在正右
  • (?:非捕获组
    • 011匹配011
    • |
    • 5[0-9][0-9]匹配5和2次数字0-9
  • ) 关闭群组
  • [0-9]{12}匹配12位数字
  • $ 字符串结尾

Regex demo

为什么不按照老式的方式来做呢?

Substr 和 if 就可以很好地完成工作。在我看来更容易阅读。

if(strlen($card) == 16 && 
   (substr($card, 0,2) == "60") ||
   substr($card, 0,4) == "6521") ||
   substr($card, 0,4) == "6522"))){
   echo "it's ru pay card";
}