为啥 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# 正则表达式信用卡验证函数会使用无效值进行验证? [复制]的主要内容,如果未能解决你的问题,请参考以下文章