快速入門
教程
工具和語言
示例
參考
書評
示例
正則表達式示例
數字範圍
浮點數
電子郵件地址
IP地址
有效日期
數字日期轉文本
信用卡號碼
匹配完整行
刪除重複行
編程
兩個相近的單詞
陷阱
災難性回溯
重複次數過多
拒絕服務攻擊
使一切選項化
重複捕獲組
混合Unicode和8位
更多關於本站
簡介
正則表達式快速入門
正則表達式教程
替換字符串教程
應用程序和語言
正則表達式示例
正則表達式參考
替換字符串參考
書評
可打印的PDF
關於本站
RSS訂閱和博客
RegexMagic—Generate regular expressions matching credit card numbers

尋找或驗證信用卡號碼

通過幾個簡單的正則表達式,您可以輕鬆驗證客戶在訂單表單上輸入的有效信用卡號碼。您甚至可以確定所使用的信用卡類型。每張卡的發卡機構都有其自己的卡號範圍,由前4位數字標識。

您可以使用略有不同的正則表達式來尋找信用卡號碼,或者在更大的文檔中尋找可能是信用卡號碼的數字序列。在安全審計中,這非常有用,以證明您沒有不當地暴露客戶的財務詳情。

我們將從訂單表單開始。

去除空格和破折號

第一步是從客戶輸入的信用卡號碼中刪除所有非數字字符。實體信用卡中在卡號中有空格以分組數字,這使人類更容易閱讀或輸入。因此,您的訂單表單應該接受帶有空格或破折號的卡號。

要從卡號中刪除所有非數字字符,只需使用您的編程語言中的“全部替換”函數來搜索正則表達式 [^0-9]+,並將其替換為空。如果您只想替換空格和破折號,可以使用 [ -]+。如果此正則表達式看起來奇怪,請記住,在字符類中,當連字符出現在右括號(或在左括號或否定符號之後)時,它是一個字面值。

如果你想知道為什麼要使用 加號:那是為了提高性能。如果輸入中有連續的非數字,例如 1===2,那麼 [^0-9]+ 就會一次匹配三個等號,並一次性刪除它們進行替換。如果沒有加號,則需要三次替換。在這種情況下,節省的時間僅為幾微秒。但保持正則表達式效率的習慣是很好的。雖然在這裡節省的時間很少,但輸入額外的加號所需的努力也很少。

在您的訂單表格上驗證信用卡號碼

驗證信用卡號碼是正則表達式的理想應用場景。它們只是一系列包含 13 到 16 個數字,開頭有幾個特定的數字來識別卡發行者。您可以使用以下特定的正則表達式,在顧客試圖使用您不接受的卡類型時提醒他們,或者將使用不同卡的訂單路由到不同的處理器。所有這些正則表達式都來自 RegexBuddy 的庫

如果您只想檢查卡號是否看起來有效,而不確定品牌,您可以使用上述六個正則表達式組合,使用 交替。一個 非捕獲組錨點 放在交替之外。 自由空間 允許註釋和正則表達式適應此頁面的寬度。

^(?:4[0-9]{12}(?:[0-9]{3})?          # Visa
 
|  (?:5[1-5][0-9]{2}                # MasterCard
     
| 222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}
 
|  3[47][0-9]{13}                   # American Express
 
|  3(?:0[0-5]|[68][0-9])[0-9]{11}   # Diners Club
 
|  6(?:011|5[0-9]{2})[0-9]{12}      # Discover
 
|  (?:2131|1800|35\d{3})\d{11}      # JCB
)$

這些正則表達式將輕鬆捕獲因客戶輸入過多或過少位數而無效的卡號。它們不會捕獲帶有錯誤數位的卡號。為此,您需要遵循 Luhn 算法,這不能使用正則表達式完成。當然,即使卡號在數學上是有效的,也不代表以該號碼發行了卡片或帳戶中有錢。正則表達式的好處是,您可以將其放入一點 JavaScript 中,立即檢查明顯的錯誤,而不是讓客戶等待 30 秒以便您的信用卡處理器拒絕訂單。如果您的卡片處理器對失敗的交易收費,您真的需要實現正則表達式和 Luhn 驗證。

在文件中查找信用卡號碼

通過兩個簡單的修改,您可以使用上述任何一個正則表達式在更大的文檔中查找卡號。只需將 插入符號和美元符號 替換為 單字邊界,如 \b4[0-9]{12}(?:[0-9]{3})?\b

如果您計劃搜索一個大型文檔服務器,則簡化的正則表達式將加速搜索。除非您的公司對其他用途使用 16 位數字,否則偽陽性很少。正則表達式 \b\d{13,16}\b 將找到任何 13 到 16 位數字的序列。

在搜索滿是文件的硬碟時,您不能像驗證單個卡號時那樣先去掉空格和破折號。要找到帶有空格或破折號的卡號,請使用 \b(?:\d[ -