C# 根据号码获取信用卡类型
在你将此标记为在另一篇文章中回答之前(我已经看到了这些)。但他们都没有明确表示他们建议的正则表达式适用于C#(我认为他们更关注Javascript)。现在我对正则表达式不是很在行,但是如果能帮我决定如何获取类型,我将不胜感激。一旦我获得正则表达式,我如何根据正则表达式验证输入的cc 我在StackOverflow的许多帖子中都看到了这一点,但这在C#(相同的代码)中有效吗?如果是,我如何将我的信用卡字符串与正则表达式进行比较C# 根据号码获取信用卡类型,c#,asp.net,C#,Asp.net,在你将此标记为在另一篇文章中回答之前(我已经看到了这些)。但他们都没有明确表示他们建议的正则表达式适用于C#(我认为他们更关注Javascript)。现在我对正则表达式不是很在行,但是如果能帮我决定如何获取类型,我将不胜感激。一旦我获得正则表达式,我如何根据正则表达式验证输入的cc 我在StackOverflow的许多帖子中都看到了这一点,但这在C#(相同的代码)中有效吗?如果是,我如何将我的信用卡字符串与正则表达式进行比较 我真的很感激任何帮助,这是我第一次处理信用卡验证,只需要得到类型。根
我真的很感激任何帮助,这是我第一次处理信用卡验证,只需要得到类型。根据需要下拉列表的人的反馈,下拉列表是不可能的。该页面上的任何正则表达式都将在C#中工作。例如:
string isVisa = "^4[0-9]{12}(?:[0-9]{3})?$";
string ccnumber = "1234123412341234";
if (System.Text.RegularExpressions.Regex.IsMatch(ccnumber, isVisa)) {
// valid Visa card
}
我经常推荐一个程序来测试C#中的正则表达式。您将能够测试该程序中的任何信用卡号验证模式。下面是下一个家伙的更完整答案
public enum CardType
{
MasterCard, Visa, AmericanExpress, Discover, JCB
};
public static CardType FindType(string cardNumber)
{
//https://www.regular-expressions.info/creditcard.html
if (Regex.Match(cardNumber, @"^4[0-9]{12}(?:[0-9]{3})?$").Success)
{
return CardType.Visa;
}
if (Regex.Match(cardNumber, @"^(?:5[1-5][0-9]{2}|222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}$").Success)
{
return CardType.MasterCard;
}
if (Regex.Match(cardNumber, @"^3[47][0-9]{13}$").Success)
{
return CardType.AmericanExpress;
}
if (Regex.Match(cardNumber, @"^6(?:011|5[0-9]{2})[0-9]{12}$").Success)
{
return CardType.Discover;
}
if (Regex.Match(cardNumber, @"^(?:2131|1800|35\d{3})\d{11}$").Success)
{
return CardType.JCB;
}
throw new Exception("Unknown card.");
}
//test validation
//https://www.getcreditcardnumbers.com/
Validate("4169773331987017");//visa
Validate("4658958254583145");//visa
Validate("4771320594033780");//visa
Validate("5410710000901089");//mc
Validate("5289675573349651");//mc
Validate("5582128534772839");//mc
Validate("349101032764066");//ae
Validate("343042534582349");//ae
Validate("371305972529535");//ae
Validate("6011683204539909");//discover
Validate("6011488563514596");//discover
Validate("6011465836488204");//discover
Validate("3529908921371639");//jcb
Validate("3589295535870728");//jcb
Validate("3569239206830557");//jcb
这是对前一个人更完整的回答
public string CC_NUM { get; set; }
/// <summary>
/// getCardType()
/// </summary>
/// <returns>Matches a object reference to regex to bring back a card type, the validity of the card, or a default (Unknown)</returns>
public CreditCardType getCardType()
{
return new Regex(@"^4[0-9]{6,}$").IsMatch(CC_NUM) ? CreditCardType.Visa :
new Regex(@"^5[1-5][0-9]{5,}|222[1-9][0-9]{3,}|22[3-9][0-9]{4,}|2[3-6][0-9]{5,}|27[01][0-9]{4,}|2720[0-9]{3,}$").IsMatch(CC_NUM) ? CreditCardType.MasterCard :
new Regex(@"^3[47][0-9]{5,}$").IsMatch(CC_NUM) ? CreditCardType.AmericanExpress :
new Regex(@"^65[4-9][0-9]{13}|64[4-9][0-9]{13}|6011[0-9]{12}|(622(?:12[6-9]|1[3-9][0-9]|[2-8][0-9][0-9]|9[01][0-9]|92[0-5])[0-9]{10})$").IsMatch(CC_NUM) ? CreditCardType.Discover :
new Regex(@"^3[47][0-9]{13}$").IsMatch(CC_NUM) ? CreditCardType.Amex :
new Regex(@"^(6541|6556)[0-9]{12}$").IsMatch(CC_NUM) ? CreditCardType.BCGlobal :
new Regex(@"^389[0-9]{11}$").IsMatch(CC_NUM) ? CreditCardType.CarteBlanch :
new Regex(@"^3(?:0[0-5]|[68][0-9])[0-9]{11}$").IsMatch(CC_NUM) ? CreditCardType.DinersClub :
new Regex(@"^63[7-9][0-9]{13}$").IsMatch(CC_NUM) ? CreditCardType.InstaPaymentCard :
new Regex(@"^(?:2131|1800|35\d{3})\d{11}$").IsMatch(CC_NUM) ? CreditCardType.JCBCard :
new Regex(@"^9[0-9]{15}$").IsMatch(CC_NUM) ? CreditCardType.KoreanLocal :
new Regex(@"^(6304|6706|6709|6771)[0-9]{12,15}$").IsMatch(CC_NUM) ? CreditCardType.LaserCard :
new Regex(@"^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$").IsMatch(CC_NUM) ? CreditCardType.Maestro :
new Regex(@"^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$").IsMatch(CC_NUM) ? CreditCardType.Solo :
new Regex(@"^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$").IsMatch(CC_NUM) ? CreditCardType.SwitchCard :
new Regex(@"^(62[0-9]{14,17})$").IsMatch(CC_NUM) ? CreditCardType.UnionPay :
CC_NUM.Where((e) => e >= '0' && e <= '9').Reverse().Select((e, i) => ((int)e - 48) * (i % 2 == 0 ? 1 : 2)).Sum((e) => e / 10 + e % 10) == 0 ? CreditCardType.NotFormatted :
CreditCardType.Unknown;
}
/// <summary>
/// isCreditCardAccepted()
/// </summary>
/// <returns>Checks to see if the credit card is allowed by comparing it to the integer value of CreditCardType to a local array of allowed integers</returns>
public bool isCreditCardAccepted()
{
// This should honestly be internalized somewhere for security reasons
int[] allowed = new int[] { 0, 1, 2, 3 };
return Array.IndexOf(allowed, getCardType()) >= 0;
}
public enum CreditCardType
{
Visa = 0,
MasterCard = 1,
AmericanExpress = 2,
Discover = 3,
Amex = 4,
BCGlobal = 5,
CarteBlanch = 6,
DinersClub = 7,
InstaPaymentCard = 8,
JCBCard = 9,
KoreanLocal = 10,
LaserCard = 11,
Maestro = 12,
Solo = 13,
SwitchCard = 14,
UnionPay = 15,
NotFormatted = 16,
Unknown = 17
}
公共字符串CC_NUM{get;set;}
///
///getCardType()
///
///将对象引用与正则表达式匹配以返回卡类型、卡的有效性或默认值(未知)
公共信用卡类型getCardType()
{
返回新的正则表达式(@“^4[0-9]{6,}$”)。IsMatch(CC_NUM)?CreditCardType。Visa:
新正则表达式(“^5[1-5][0-9]{5,}222[1-9][0-9]{3,}22[3-9][0-9]{4,}2[3-6][0-9]{5,}27[01][0-9]{4,}2720[0-9]{3,}$”)。IsMatch(CC|NUM CreditCardType.MasterCard:
新的正则表达式(“^3[47][0-9]{5,}$”).IsMatch(CC_NUM)?CreditCardType.AmericanExpress:
新正则表达式(“^65[4-9][0-9]{13}64[4-9][0-9]{13}6011[0-9]{12}}|(622(?:12[6-9]| 1[3-9][0-9][2-8][0-9][0-9]| 9[01][0-9]| 92[0-5])[0-9]{10}”)IsMatch(CC| cardu NUM credittype.Discover:
新的正则表达式(“^3[47][0-9]{13}$”).IsMatch(CC_NUM)?CreditCardType.Amex:
新的正则表达式(@“^(6541 | 6556)[0-9]{12}$”).IsMatch(CC|NUM)?CreditCardType.BCGlobal:
新的正则表达式(“^389[0-9]{11}$”).IsMatch(CC_NUM)?CreditCardType.careblanch:
新的正则表达式(“^3(?:0[0-5]|[68][0-9])[0-9]{11}$”)。IsMatch(CC_NUM)?CreditCardType.DinersClub:
新的正则表达式(“^63[7-9][0-9]{13}$”).IsMatch(CC_NUM)?CreditCardType.InstaPaymentCard:
新正则表达式(@“^(?:2131 | 1800 | 35\d{3})\d{11}$”).IsMatch(CC|NUM)?CreditCardType.JCBCard:
新的正则表达式(“^9[0-9]{15}$”).IsMatch(CC_NUM)?CreditCardType.KoreanLocal:
新的正则表达式(^(6304 | 6706 | 6709 | 6771)[0-9]{12,15}$”)。IsMatch(CC|NUM)?CreditCardType.LaserCard:
新正则表达式(^(5018 | 5020 | 5038 | 6304 | 6759 | 6761 | 6763)[0-9]{8,15}$”).IsMatch(CC|NUM)?CreditCardType.Maestro:
新的正则表达式(^(6334 | 6767)[0-9]{12}|(6334 | 6767)[0-9]{14}}|(6334 | 6767)[0-9]{15}$)。IsMatch(CC|NUM)?CreditCardType.Solo:
(3)0-9{{12}}}号(((^))新监管层(((^)号(490 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 7 7 7 7 7 7 7 7 7 7 7 7 7)))))以及(0-9 3 3 3 3 0 0 0 0 0 0 0-3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0{13}633110[0-9]{10}633110[0-9]{12}633110[0-9]{13}$”。IsMatch(CC_NUM)?CreditCardType.SwitchCard:
新的正则表达式(@“^(62[0-9]{14,17})$”).IsMatch(CC_NUM)?CreditCardType.UnionPay:
CC_NUM.Where((e)=>e>='0'和&e((int)e-48)*(i%2==0?1:2)).Sum((e)=>e/10+e%10)==0?CreditCardType.NotFormatted:
CreditCardType。未知;
}
///
///isCreditCardAccepted()
///
///通过将信用卡与CreditCardType的整数值与允许的整数的本地数组进行比较,检查是否允许使用信用卡
公共文件isCreditCardAccepted()
{
//出于安全原因,这应该在某个地方被内化
允许的int[]=新的int[]{0,1,2,3};
返回数组.IndexOf(允许,getCardType())>=0;
}
公共枚举CreditCardType
{
Visa=0,
万事达卡=1,
AmericanExpress=2,
Discover=3,
美国运通=4,
BCGlobal=5,
笛卡尔布兰奇=6,
食客俱乐部=7,
InstaPaymentCard=8,
JCBCard=9,
KoreanLocal=10,
激光卡=11,
迈斯特罗=12,
索洛=13,
开关卡=14,
银联=15,
NotFormatted=16,
未知=17
}
使用正则表达式更新版本
以及枚举:
public enum CreditCardType
{
AmericanExpress,
BCGlobal,
CarteBlanche,
DinersClub,
Discover,
InstaPayment,
JCB,
KoreanLocal,
Laser,
Maestro,
Mastercard,
Solo,
Switch,
UnionPay,
Visa,
VisaMasterCard,
Invalid
}
我会尽量在我的回答中独树一帜。他们说给人一根鱼竿比给鱼好。所以我的钓竿是:拿起来。这是一个很棒的正则表达式编辑器,它向您展示了如何在各种场景(搜索、替换、提取组等)中使用各种语言编写正则表达式。它非常完美,除了他们的技术支持,尽管你很少需要它。太好了,非常感谢你的及时回复。如果我将输入的字符串与正则表达式进行比较,那么最好的方法是什么。。比如说如果(ccText匹配此表达式)卡类型=美国运通;您将使用
System.Text.RegularExpressions.Regex
类。这是文档,它包括一个教程(可能有点复杂-如果有问题请回复):我刚刚意识到我在抄送号码中保留了破折号,应该删除这些破折号。返回美国运通378224631005的万事达卡
public enum CreditCardType
{
AmericanExpress,
BCGlobal,
CarteBlanche,
DinersClub,
Discover,
InstaPayment,
JCB,
KoreanLocal,
Laser,
Maestro,
Mastercard,
Solo,
Switch,
UnionPay,
Visa,
VisaMasterCard,
Invalid
}