簡體   English   中英

mysql REGEXP精確模式匹配

[英]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]')

試試正則表達式^([0-9]{4}[-[:space:]]?){4}$

這將匹配由空格或連字符分隔的16個數字(可選)

正則表達式

存在已知的復雜正則表達式,以匹配大型信用卡提供商(例如Visa和MasterCard)的卡號。 就您的問題而言,以下模式非常接近您想要的:

SELECT *
FROM yourTable
WHERE ccno REGEXP '^[0-9]{4}([[:space:]-]?[0-9]{4}){3}$';

演示

這種模式並不精確,但是您的數據仍然沒有匹配,例如Amex卡,其格式為dddd-dddddd-ddddd ,帶有兩個破折號,而不是三個破折號。 如果計划使用生產數據執行此操作,則應研究如何將信用卡號與正則表達式匹配。

https://www.regular-expressions.info/creditcard.html

盡管以上兩個答案可以幫助我找到所需的內容,但我現在編寫了整個查詢,可以完全匹配純文本信用卡。 此查詢可正常使用的卡為:
美國運通
簽證
萬事達
發現

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM