如何使用正則表達式匹配信用卡號碼?

如何匹配多種信用卡號碼格式?1.了解各卡種規(guī)則:visa以4開頭13或16位;mastercard以51-55或2221-2720開頭16位;amex以34或37開頭15位;discover以特定數(shù)字組合開頭16位;2.使用正則表達式匹配格式;3.處理輸入中的空格或連字符;4.確保正則以^開頭$結(jié)尾;5.結(jié)合luhn算法驗證合法性。

如何使用正則表達式匹配信用卡號碼?

信用卡號碼通常由13到19位數(shù)字組成,不同發(fā)卡機構(gòu)的格式也略有差異。如果你想通過正則表達式來匹配常見的信用卡號碼格式,有幾個關(guān)鍵點需要注意:長度、起始數(shù)字和校驗機制(如Luhn算法)。下面是一些實用的方法和建議。

如何使用正則表達式匹配信用卡號碼?


常見信用卡號格式與對應(yīng)正則表達式

不同的信用卡公司有不同的編號規(guī)則:

如何使用正則表達式匹配信用卡號碼?

  • Visa:以4開頭,13或16位
    示例正則:^4[0-9]{12}(?:[0-9]{3})?$

  • MasterCard:以51-55或2221-2720開頭,16位
    示例正則:^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{12}|720[0-9]{12}))$

    如何使用正則表達式匹配信用卡號碼?

  • American express (Amex):以34或37開頭,15位
    示例正則:^3[47][0-9]{13}$

  • Discover:以6011、65、644-649 或 622126-622925等開頭,16位
    示例正則:^6(?:011|5[0-9]{2}|4[4-9][0-9]|22(?:1(?:2[6-9]|[3-9][0-9])|[2-8][0-9]{2}|9(?:[01][0-9]|2[0-5])))d{12}$

這些正則表達式可以作為基礎(chǔ)模板使用,但注意它們只能識別格式是否正確,并不能驗證卡片是否真實有效。


如何在代碼中使用這些正則?

python為例,你可以用 re.match() 來檢查字符串是否符合某個模式:

import re  def is_visa(card_number):     pattern = r"^4[0-9]{12}(?:[0-9]{3})?$"     return bool(re.match(pattern, card_number))  # 示例 print(is_visa("4111111111111111"))  # 輸出: True

類似地,你也可以為其他類型的卡創(chuàng)建函數(shù)。不過要注意的是,輸入的信用卡號可能帶有空格或連字符,比如 4111-1111-1111-1111 或 4111 1111 1111 1111,這時你需要先做清理處理:

card_number = re.sub(r"[^d]", "", card_number)

這樣就可以統(tǒng)一格式,避免因為符號導(dǎo)致匹配失敗。


匹配時容易忽略的幾點

  • 前導(dǎo)和后綴字符:確保你的正則表達式以 ^ 開頭并以 $ 結(jié)尾,防止部分匹配。
  • 空格和分隔符:用戶輸入時常會包含空格、短橫線等非數(shù)字字符,需提前清洗。
  • Luhn校驗:即使格式正確,也不代表是合法卡號。如果你需要更嚴(yán)格的驗證,應(yīng)該額外加上Luhn算法校驗。
  • 國際卡種擴展:有些國家或地區(qū)有特殊格式的卡號,通用正則可能無法覆蓋。

基本上就這些。寫一個能準(zhǔn)確匹配多種信用卡格式的正則不算太難,但要兼顧靈活性和準(zhǔn)確性,還是得多考慮實際輸入形式和業(yè)務(wù)需求。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點贊14 分享