C# 根据号码获取信用卡类型

C# 根据号码获取信用卡类型,c#,asp.net,C#,Asp.net,在你将此标记为在另一篇文章中回答之前(我已经看到了这些)。但他们都没有明确表示他们建议的正则表达式适用于C#(我认为他们更关注Javascript)。现在我对正则表达式不是很在行,但是如果能帮我决定如何获取类型,我将不胜感激。一旦我获得正则表达式,我如何根据正则表达式验证输入的cc 我在StackOverflow的许多帖子中都看到了这一点,但这在C#(相同的代码)中有效吗?如果是,我如何将我的信用卡字符串与正则表达式进行比较 我真的很感激任何帮助,这是我第一次处理信用卡验证,只需要得到类型。根

在你将此标记为在另一篇文章中回答之前(我已经看到了这些)。但他们都没有明确表示他们建议的正则表达式适用于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
}