[英]mysql REGEXP exact pattern match
我正在編寫一個php腳本,它將遍歷數據庫中的所有表並查找純文本信用卡號。 為此,我正在使用MySQL REGEXP。 我只需要“僅”包含信用卡號的那些結果。 如果有任何包含信用卡號的文本數據,則腳本不應考慮它。
例如
| id | ccno |
| 1 | 4111111111111111 |
| 2 | 4111 1111 1111 1111 |
| 3 | 4111-1111-1111-1111 |
| 4 | 一些文本4111111111111111一些文本|
如果查詢在上面的表上觸發,那么它應該返回前3條記錄,而不應該返回第4條記錄。 為此,我使用以下查詢,而我面臨的問題是查詢返回所有4條記錄。
SELECT ccno FROM aacc WHERE
(ccno = REGEXP '[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
OR ccno = REGEXP '[0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9] [0-9][0-9][0-9][0-9]'
OR ccno = REGEXP '[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]')
存在已知的復雜正則表達式,以匹配大型信用卡提供商(例如Visa和MasterCard)的卡號。 就您的問題而言,以下模式非常接近您想要的:
SELECT *
FROM yourTable
WHERE ccno REGEXP '^[0-9]{4}([[:space:]-]?[0-9]{4}){3}$';
這種模式並不精確,但是您的數據仍然沒有匹配,例如Amex卡,其格式為dddd-dddddd-ddddd
,帶有兩個破折號,而不是三個破折號。 如果計划使用生產數據執行此操作,則應研究如何將信用卡號與正則表達式匹配。
盡管以上兩個答案可以幫助我找到所需的內容,但我現在編寫了整個查詢,可以完全匹配純文本信用卡。 此查詢可正常使用的卡為:
美國運通
簽證
萬事達
發現
MySQL查詢是:
SELECT *
FROM yourTable
WHERE (ccno REGEXP '^4[0-9]{3}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^3[47][0-9]{2}[[:space:]-]?[0-9]{6}[[:space:]-]?[0-9]{5}$'
OR ccno REGEXP '^6011([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^65[0-9]{2}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^5[1-5][0-9]{2}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^222[1-9]([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^2[3-6][0-9]{2}([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^27[01][0-9]([[:space:]-]?[0-9]{4}){3}$'
OR ccno REGEXP '^2720([[:space:]-]?[0-9]{4}){3}$'
);
工作示例可以在這里看到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.