如何使用正則表示式驗證萬事達卡號?
萬事達卡是一家跨國金融服務公司,自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 卡號定義特定的模式,然後可以使用該模式快速輕鬆地驗證任何輸入的數字。
資料結構
網路
關係資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP