Regex for Discover credit card

前端 未结 3 569
一整个雨季
一整个雨季 2021-01-11 15:43

I have read through this question, but for Discover card, the starting digits are 6011, 622126-622925, 644-649, 65 instead of just 6011, 65. (Sourc

相关标签:
3条回答
  • 2021-01-11 15:58

    even this ticket is 3 years ago, I encountered the same task and would like to share a regex for 622126-622925 :)

    ^(622[1-9]\\d(?<!10|11|9[3-9])\\d(?<!12[0-5]|92[6-9])\\d{10})$
    

    which using zero-width negative lookbehind to exclude not expected number

    0 讨论(0)
  • 2021-01-11 16:13

    Here's your regex (demo):

    ^6(?:011\d{12}|5\d{14}|4[4-9]\d{13}|22(?:1(?:2[6-9]|[3-9]\d)|[2-8]\d{2}|9(?:[01]\d|2[0-5]))\d{10})$
    

    Needless to say, I won't exactly call this pretty or easy to maintain. I would recommend parsing the number as an integer and using your programming language to do the checks.

    You should also use Luhn algorithm to check if the credit card number is valid, and while you could theoretically do this with regex, it would many times worse than this.


    Allow me to show you how I arrived at this monstrosity, step by step. First, here is how you match each of those ranges:

    6011        # matches 6011
    65          # matches 65
    64[4-9]     # matches 644-649
    622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))  
                # matches 622126-622925
    

    Now, you want to match the rest of the digits:

    6011\d{12}        # matches 6011 + 12 digits
    65\d{14}          # matches 65 + 14 digits
    64[4-9]\d{13}     # matches 644-649 + 13 digits
    622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10}
                      # matches 622126-622925 + 10 digits
    

    Now you can combine all four, and add start and end of line anchors:

    ^(                  # match start of string and open group
     6011\d{12}|        # matches 6011 + 12 digits
     65\d{14}|          # matches 65 + 14 digits
     64[4-9]\d{13}|     # matches 644-649 + 13 digits
     622(1(2[6-9]|[3-9]\d)|[2-8]\d{2}|9([01]\d|2[0-5]))\d{10}
                        # matches 622126-622925 + 10 digits
    )$                  # close group and match end of string
    

    The final product above is a slightly compacted version of the previous regex, and I also made groups non-capturing (that's what those ?: are for).

    0 讨论(0)
  • 2021-01-11 16:16

    Here are your options:

    1. Hack your way through it and build a really complicated regex. Regexes are not suited for this sort of integer comparison so what you come up with will necessarily be long, uncomplicated and unmaintainable. See Regex for number check below a value and similar SO questions on this topic.
    2. Use integer comparison in your code.

    For reference one such said complicated regex would be

    62212[6-9]|6221[3-9]|622[1-8]|62291|62292[1-5]

    0 讨论(0)
提交回复
热议问题