如何使用正则表达式验证万事达卡号?


万事达卡是一家跨国金融服务公司,自1966年成立以来一直为全球客户提供支付处理服务。其总部仍设在美国纽约。它是世界上最大的支付系统之一,与Visa和美国运通等公司竞争。由于提供的产品种类繁多,包括信用卡、借记卡和预付卡,因此它们脱颖而出,非常适合消费者和企业的需求。

其中包括预付卡、借记卡和信用卡。为了在全球范围内分发这些卡选项,它与全球金融机构合作,以便它们能够向企业和个人发放万事达卡品牌的卡。这种战略合作伙伴关系确保了其优质服务在全球范围内的广泛覆盖。

方法

以下是用正则表达式验证万事达卡号的三种不同方法:

方法 1:使用前瞻断言

方法 2:使用反向引用

方法 1:使用前瞻断言

前瞻断言可用于验证万事达卡号的校验和。校验和使用Luhn算法计算,该算法涉及将每隔一个数字乘以2,然后将这些结果加到未乘以的数字中。总和应该能被10整除。

语法

正则表达式仅在模式后面是否跟随另一个模式时才使用前瞻断言来匹配模式。可以使用以下语法使用正则表达式和前瞻断言来验证万事达卡号:

^(5[1-5][0-9]{2}(?=[\s|-])|\d{4}(?=[\s|-])?\d{4}(?=[\s|-])?\d{4}(?=[\s|-])?\d{1,4}(?!\d))$

让我们分解语法以了解其工作原理:

  • 匹配字符串的开头。

    5[1-5][0-9]{2}(?=[\s|-])

    匹配以5开头、后跟1到5之间的数字、再跟两个数字以及空格或连字符的万事达卡号。为此使用了正前瞻断言(?=[s|-]), 它确定后面的字符是连字符还是空格,而不会将其添加到匹配项中。

    |\d{4}(?=[\s|-])?\d{4}(?=[\s|-])?\d{4}(?=[\s|-])?\d{1,4}(?!\d)

    匹配不以5开头、后跟另一个数字、总共有16位数字(每4位数字之间可选的空格或连字符)、且后跟5的万事达卡号。这是通过使用负前瞻断言(?!d)获得的,该断言评估后面的字符是否为数字。

  • $

    匹配字符串的结尾。

算法

使用前瞻断言和正则表达式验证万事达卡号的方法:

步骤 1 - 首先定义匹配万事达卡号的正则表达式模式。字符串锚的开头(^)和结尾($)分别表示模式的起始点和结束点。

步骤 2 - 使用前瞻断言检查数字是否满足以下要求:

  • 数字的第一位必须是5。要验证这一点,请使用前瞻断言(?=5)。

  • 第二位数字应该在1到5之间。要验证这一点,请使用前瞻断言(?=[1-5])。

  • 数字需要有16位。要检查这一点,请使用前瞻断言(?=d16)。

步骤 3 - 使用交替运算符(|)来适应两种不同的万事达卡号格式:以空格或连字符分隔的四组四位数字,或者不带空格或连字符的16位数字。例如,(?:(?:d4[s-]?){3}\d{4}|(?:\d{16}))

步骤 4 - 在代码中使用正则表达式模式来验证万事达卡号。如果模式与给定的字符串匹配,则该数字是有效的万事达卡号。

总的来说,此方法使用前瞻断言检查万事达卡号是否符合一系列要求,然后以两种格式之一将该数字与正则表达式模式进行匹配。

示例 1

在此示例中,我们定义函数isMastercard,它接受字符串cardNumber作为输入,并使用正则表达式检查数字的有效性以确定它是否是有效的万事达卡号。正则表达式模式分为两部分:

  • 第一部分,([1-5][0-9]]2),对应于万事达卡号的前六位数字,它必须以“5”开头,后跟“1”到“5”之间的数字,然后是“0”到“9”之间的两个数字。在本部分模式中没有进行前瞻断言。

  • 第二部分,(?=d12$)[0-9]8$,是一个前瞻断言,它验证卡号的其余数字是否由恰好12位数字组成,然后是8位数字。仅用于前瞻,此部分模式不包括在实际匹配中。

上述模式在isMastercard方法中定义为正则表达式对象模式,并且使用regex_match函数检查cardNumber字符串是否与该模式匹配。如果匹配,则输入是有效的万事达卡号,在这种情况下,我们返回true。如果不是,我们返回false。

我们在main函数中将一个示例万事达卡号定义为字符串,并将其馈送到isMastercard函数。然后打印出卡号的有效性。

请记住,还有其他正则表达式模式可用于验证万事达卡号;这只是一个示例。不同的系统和应用程序可能会使用不同的模式。

#include <iostream>
#include <regex>
using namespace std;

bool isMastercard(string cardNumber) {
   regex pattern("^(5[1-5][0-9]{2})(?=\d{12}$)[0-9]{8}$");
   return regex_match(cardNumber, pattern);
}

int main() {
   string cardNumber = "5432345678901234";
   bool isValid = isMastercard(cardNumber);
   if (isValid) {
      cout << "Mastercard number " << cardNumber << " is valid" << endl;
   } else {
      cout << "Mastercard number " << cardNumber << " is invalid" << endl;
   }
   return 0;
}

输出

Mastercard number 5432345678901234 is invalid

方法 2. 使用反向引用

可以使用反向引用来验证万事达卡号的Luhn校验和。我们可以使用以下算法来验证Luhn校验和:

  • 从最右边的数字开始(除了最后两个),将每个后续数字加倍。

  • 将所有结果数字加起来,包括未加倍的数字

  • 如果加倍的数字大于9,则结果总和必须能被9整除。

语法

可以使用以下语法使用正则表达式和反向引用来验证万事达卡号:

^5[1-5] [0-9]{2}(\s|-)?[0-9]{4}(\s|-)?[0-9]{4}(\s|-)?[0-9]{4}$

此正则表达式使用可选的反向引用(s|-)?来匹配空格或连字符。

因此,用户可以使用多种格式输入卡号,例如“5555 5555 5555 4444”和“5555-5555-5555-4444”。

正则表达式同时匹配字符串的第一个字符和最后一个字符,^和$。万事达卡号的前三位数字,表示为[1-5][0-9]2,必须在51到55之间。三次重复[0-9]4来表示其余数字,并在每次重复之间放置可选的s|-反向引用。

算法

以下是使用反向引用使用正则表达式验证万事达卡号的分步算法:

步骤 1 - 定义正则表达式:

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

此正则表达式匹配任何包含数字5、1到5之间的数字以及14个0到9之间的数字的字符串。^和$锚点确保整个字符串都遵循此模式。

步骤 2 - 添加反向引用以检查最后一位数字:

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

[0-9]周围的括号创建捕获字符串最后一位数字的反向引用。

步骤 3 - 添加Luhn算法检查:

^5[1-5][0-9]{14}([0-9])([0-9]{2})?$

正则表达式的末尾处的([0-9]2]?)允许在字符串的末尾可选地附加两位数。这是执行Luhn算法检查所必需的。

步骤 4 - 使用反向引用反转字符串:

^5[1-5][0-9]{14}([0-9])([0-9]{2})?$ -> ^([0-9])([0-9]{2})?[0-9]{14}5[1-5]$

此步骤中使用了反向引用方法来反转字符串的顺序。字符串的最后两位数字被([0-9]) ([0-9]2])?捕获,并分别存储在反向引用1和2中。然后可以使用这些反向引用来反转字符串。

步骤 5 - 将Luhn算法应用于反转后的字符串:

^([0-9])([0-9]{2})?[0-9]{14}5[1-5]$ -> ^([0-9])([0-9]{2})?[0-9]{14}(?:([0-9])(?:(?:(\d)(?=\d{0,13}$))?\d)?([02468])(?=\d{0,11}$))?$

现在,Luhn 算法检查已添加到反转后的字符串中。该正则表达式为 (? :([0-9])(? :(?='d'0,13'$))? ([02468])(?='d'0,11'$))?。在正则表达式的结尾使用 Luhn 算法进行校验。它通过检查奇数位数字(从右开始)的总和以及偶数位数字的总和(必要时加倍然后求和)来确认整个数字是否能被 10 整除。

步骤 6 − 验证输入 −

可以使用 PHP 中的 preg_match 或 Python 中的 re.match 等函数,根据正则表达式检查输入。如果输入与正则表达式匹配,则该输入是有效的 MasterCard 卡号。

示例 2

在这个示例中,我们构建了一个 validateMasterCard 函数,它接受表示 MasterCard 卡号的字符串作为输入,如果文本有效则返回 true,否则返回 false。我们应用正则表达式来匹配有效 MasterCard 卡号的结构。

使用正则表达式模式 5[1-5]。[0-9]14$。所讨论的字符串模式突出显示了一个包含 15 个整数的序列,该序列严格以数字“5”开头或结尾,后跟 1 到 5 之间的任意一位数字,最后以 14 位任意选择的数字 (0-9) 结尾。本质上,起始标记表示开头,而符号“$”用作结束点。

为了找出输入的卡号是否类似于正则表达式模式,我们使用 regex match 函数。如果它确实类似,则返回 true;如果它不类似,则返回 false。

我们在主函数中定义一个示例 MasterCard 卡号,并将其传递给 validateMasterCard 函数。我们打印一条消息,指示该数字是否有效。如果数字有效,我们将打印一条消息指示这一点。

#include <iostream>
#include <regex>
using namespace std;

bool validateMastercard(string cardNumber) {
   regex pattern("^5[1-5][0-9]{14}$");
   return regex_match(cardNumber, pattern);
}

int main() {
   string cardNumber = "5555555555554444";
   if (validateMastercard(cardNumber)) {
      cout << "Valid Mastercard number" << endl;
   } else {
      cout << "Invalid Mastercard number" << endl;
   }
   return 0;
}

输出

Valid Mastercard number

结论

总之,使用正则表达式验证 MasterCard 卡号可以成为一个非常有用的工具,可以确保输入的卡号有效并满足特定的格式要求。正则表达式允许为 MasterCard 卡号定义特定的模式,然后可以使用该模式快速轻松地验证任何输入的数字。

更新于: 2023年7月31日

420 次浏览

启动您的 职业生涯

通过完成课程获得认证

开始学习
广告