C++ 如何使用正则表达式验证万事达卡号码
万事达卡是一家跨国金融服务公司,自1966年成立以来一直为全球客户提供支付处理服务。其总部设在美国纽约。作为世界上最大的支付系统之一,与竞争对手Visa和American Express齐名。由于其提供的商品范围广泛,可能涉及信用卡、借记卡和预付卡,因此对消费者和商业需求都非常适合。
在这些选项中,包括预付卡、借记卡和信用卡。为了在全球范围内分发这些卡片选项,万事达卡与全球金融机构合作,以便它们可以向企业和个人发行万事达卡品牌的卡片。这种战略合作确保了他们优质服务的覆盖面广泛。
方法
下面是三种使用正则表达式验证万事达卡号码的方法:
方法1:使用前瞻断言
方法2:使用反向引用
方法1:使用前瞻断言
前瞻断言可用于验证万事达卡号码的校验和。卢恩算法用于计算校验和,其中将每个数字乘以2,然后将这些结果加到未乘以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开头的MasterCard号码,后跟一个数字在1到5之间,再跟两个数字,最后是一个空格或连字符。使用正向先行断言(?=[s|-])来确定下一个字符是否为连字符或空格,而不将其包括在匹配中。
|\d{4}(?=[\s|-])?\d{4}(?=[\s|-])?\d{4}(?=[\s|-])?\d{1,4}(?!\d)
匹配不以5开头的MasterCard号码,后面没有其他数字,共有16个数字(每四个数字之间可以使用可选的空白字符或连字符),并且后面不是5。这是通过使用负向先行断言(?!d)来实现的,它判断下一个字符是否是数字。
$
匹配字符串的结尾。
步骤
使用先行断言和正则表达式验证MasterCard号码的方法−
步骤 1 − 首先定义一个可以匹配MasterCard号码的正则表达式模式。字符串锚的开头()和结尾($)应分别表示模式的起始点和结束点。
步骤 2 − 使用先行断言来检查号码是否满足以下要求−
- 数字的第一个数字必须是5。可以使用先行断言(?=5)来验证这一点。
-
第二个数字应在1到5之间。可以使用先行断言(?=[1-5])进行验证。
-
数字需要有16个数字。可以使用先行断言(?=d16)进行检查。
步骤 3 − 为了适应两种不同的MasterCard号码格式 – 由四组由空格或短划线分隔的四位数组成,或由16位数字组成 – 使用替代符号(|)。例如,(?:(?:d4[s-]?){3}\d{4}|(?:\d{16}))
步骤 4 − 在代码中使用正则表达式模式来验证MasterCard号码。如果模式与给定的字符串匹配,则该数字是合法的MasterCard号码。
总的来说,该技术使用先行断言将MasterCard号码与一系列要求进行比较,然后将号码与两种格式中的一个正则表达式模式进行匹配。
示例1
在此示例中,我们定义了一个名为isMastercard的函数,它接受一个字符串cardNumber作为输入,并使用正则表达式检查该数字的有效性,以确定它是否是合法的Mastercard号码。正则表达式模式分为两个部分−
- 第一部分(
[1-5][0-9]2
)对应于万事达卡号的前六位数字,必须以“5”开头,后跟一个介于“1”和“5”之间的数字,然后是两个介于“0”和“9”之间的数字。此部分模式没有进行向前断言。 -
第二个部分(
?=d12$
)[0-9]8$是一个向前断言,它验证卡号的剩余数字由精确12位数字和8位更多数字组成。只用于向前断言,此部分模式在实际匹配中被排除。
上述模式被定义为一个正则表达式对象模式,在isMastercard方法中使用regex_match函数检查cardNumber字符串是否与模式匹配。如果匹配,则输入是合法的万事达卡号,我们返回true。如果不匹配,则返回false。
我们在主函数中将一个示例万事达卡号定义为字符串,并将其传递给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
使用背参照的方法
可以使用背参照来验证万事达卡卡号的卢恩校验和。可以使用以下算法来验证卢恩校验和:
- 每个后续数字都要加倍,从最右边的数字开始(除了最后两个数字)。
-
将所有得到的数字相加,包括未加倍的数字。
-
如果加倍后的数字大于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”。
字符串的第一个字符和最后一个字符,即a和$,都满足正则表达式的匹配要求。由[1-5][0-9]2表示的MasterCard号码的前三位必须在51和55之间。通过三次[0-9]4的重复来表示其余的数字,并在每次重复之间放置可选的s|-反向引用。
步骤
以下是使用反向引用验证MasterCard号码的正则表达式的逐步算法:
步骤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
在这个示例中,我们构建了一个接受代表Mastercard号码的字符串作为输入的validate MasterCard函数,并在文本为真时返回true,否则返回false。我们应用了一个正则表达式来匹配一个有效的Mastercard号码的结构。
正则表达式模式5 [1-5]被采用。[0-9]14 。 所涉及的字符串模式突出显示了一个包含15个整数的序列,严格以数字“5”开头或结尾,然后是介于1到5之间的任意单个数字,最后以14个任意选择的数字(0-9)结尾。基本上,起始标记表示开头,而符号“”则用作终点。
为了确定输入卡号是否与正则表达式模式相似,我们使用正则表达式匹配函数。如果它相似,则返回true,如果不相似,则返回false。
我们在主函数中定义一个示例Mastercard号码,并将其传递给validate MasterCard函数。我们输出一个显示该号码是否有效或无效的消息。如果号码有效,我们输出相应的消息。
#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卡号定义特定的模式,然后可以用于快速和容易地验证任何输入的卡号。