【问题标题】:mysql REGEXP exact pattern matchmysql REGEXP 精确模式匹配
【发布时间】:2018-09-27 13:08:17
【问题描述】:

我正在编写一个 php 脚本,它将遍历数据库中的所有表并查找纯文本信用卡号。为此,我使用 MySQL REGEXP。我只需要那些“仅”包含信用卡号的结果。如果有任何包含信用卡号的文本数据,则脚本不应考虑它。

例如

|编号   | 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]')

【问题讨论】:

  • 你不是也想验证“校验位”吗?

标签: php mysql regex


【解决方案1】:

已知复杂的正则表达式可以匹配来自大型信用卡提供商(例如 Visa 和 MasterCard)的卡号。就您的问题而言,以下模式接近您想要的:

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

Demo

这种模式并不准确,但您的数据也不匹配,例如,美国运通卡的格式为 dddd-dddddd-ddddd,带有两个破折号,而不是三个破折号。如果您打算对生产数据执行此操作,则应研究如何将信用卡号与正则表达式匹配。

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

【讨论】:

    【解决方案2】:

    试试正则表达式^([0-9]{4}[-[:space:]]?){4}$

    这将匹配由空格或连字符分隔的 16 个数字(可选)

    regex

    【讨论】:

    • 这对 16 位数字很好,但是如何匹配 15 位数字卡?
    • @Suyog 如果您非常需要验证信用号码,那么应该read here;这个问题已经解决了很多次了。
    • 是的,谢谢@ran_0315
    【解决方案3】:

    虽然以上两个答案帮助了我寻找我想要的东西,但我现在已经编写了完整的查询,它将为纯文本信用卡提供完全匹配。 适合此查询的卡片是:
    美国运通
    签证
    万事达卡
    发现

    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}$'
           );
    

    工作示例可见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多