为啥 C# 正则表达式信用卡验证函数会使用无效值进行验证? [复制]

Posted

技术标签:

【中文标题】为啥 C# 正则表达式信用卡验证函数会使用无效值进行验证? [复制]【英文标题】:Why would a C# regex credit card validation function validate with invalid values? [duplicate]为什么 C# 正则表达式信用卡验证函数会使用无效值进行验证? [复制] 【发布时间】:2019-09-20 11:04:57 【问题描述】:

我正在创建一个支付处理器 WinForms 应用程序,它当然会将结果推送到网关 API。我只是想在发送之前验证信用卡号。我只需要一个工作的“原型”,这样我就可以在深入学习 Luhn 和 Base 10 算法之前完成 UI 的设计,所以我在论坛中找到了 ValidateCreditCard() 方法,我只需要让它发挥作用。

using System;
using System.Text;
using System.Windows.Forms;

namespace PaymentPlanCalculator

    public partial class paymentPlanCalculator : Form
    
        public paymentPlanCalculator()
        
            InitializeComponent();
        

        public void Form1_Load(object sender, EventArgs e)
        
            /****************************************** //
            /*             DEFINE VARIABLES             //
            /****************************************** */
            //I have a bunch of variables defined here, nothing relevant to the question
        

        public void Button1_Click(object sender, EventArgs e)
        
            string creditCardNumber = txtCreditCardNumber.Text;
            if (ValidateCreditCard(creditCardNumber))
            
                lblCardValid.Text = "VALID!";
            
            else
            
                lblCardValid.Text = "INVALID!";
            

        

        public bool ValidateCreditCard(string creditCardNumber)
        
            //Strip any non-numeric values
            creditCardNumber = Regex.Replace(creditCardNumber, @"[^\d]", "");

            //Build your Regular Expression
            Regex expression = new Regex(@"^(?:4[0-9]12(?:[0-9]3)?|5[1-5][0-9]14|6(?:011|5[0-9][0-9])[0-9]12|3[47][0-9]13|3(?:0[0-5]|[68][0-9])[0-9]11|(?:2131|1800|35\d3)\d11)$");

            //Return if it was a match or not
            return expression.IsMatch(creditCardNumber);
        
    


它似乎有效,但我有一种强烈的感觉,它正在验证无效的卡号,只要它们是 16 位数字并且以 4 或 5 开头。

我以前从未使用过正则表达式,而且我是一个相对绿色的 C# 程序员,所以我假设我的实现有问题,而不是我在网上找到的函数。

【问题讨论】:

见this question 【参考方案1】:

您的 STRONG 感觉与现实并不太相去甚远……它实际上是按照您所说的去做。事实是,您真的无法使用正则表达式验证信用卡号码......您将检查该号码是否符合格式,但如果它属于实际卡则不检查,因为您需要使用真实的一些可以查询银行信用卡信息的金融服务API...

如果您不能这样做,那么该正则表达式是您最好的选择...但是任何人都可以提供一个虚构的数字(或其他人的数字)。

【讨论】:

我完全明白你在说什么。问题是有几种算法可以确保它是正确的格式。我遇到的问题是,似乎任何以 4 或 5 开头的 16 位数字或任何以 3 开头的 15 位数字都将有效。这是否是说正则表达式实际上并不是发布它的人所声称的“Luhn 验证”? 不是。看到在正则表达式中执行模运算会很有趣……遗憾的是,这根本不可能。该方法只检查模式,而不是算法。 感谢您的解释。现在我以全新的眼光看待它,我清楚地看到了它在做什么。我对发布它的人所说的内容读了太多,我只是在寻找一种快速的复制粘贴解决方案来阻止我。我真的很感谢您的意见。

以上是关于为啥 C# 正则表达式信用卡验证函数会使用无效值进行验证? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

使用正则表达式验证信用卡?

使用正则表达式验证信用卡格式?

信用卡公司会发布官方正则表达式吗?

CakePHP 使用正则表达式验证蒙面信用卡

javascript和c#中的正则表达式问题

英国商家的信用卡验证资源