Search code examples
regexsymbolscredit-cardpci-compliance

PCI Compliance regex detect pattern with spaces


I have to generate a regular expression to detect patterns of text where credit card numbers are involved, I have a regular expression but fails when the text is altered with simple spaces between the text for example (not valid credit card number):

4320 7589 9456 0123

The regex is:

4\d{3}(\s+|-)?\d{4}(\s+|-)?\d{4}(\s+|-)?\d{4}

This regex match easy, but if someone alter the text with spaces between any number like this:

4 320 7589 9456 0123

Does not match, I need a regex to detect any possible variable with spaces, special symbols, letters, some examples:

43 20 75 89 94 56 01 23
4 3 2 0 7 5 8 9 9 4 5 6 0 1 2 3
4320a7589b9456c0123
4320$7589$9456$0123
4320_7589_9456_0123

I don't know if I can strip any space, symbols from the pattern to analyze the text?


Solution

  • I am posting because you actually asked for help with pattern to match any number of non-digits between the first 4 and 15 more digits.

    The pattern is

    ^4(?:\D*\d){15}$
    

    See demo

    Regex breakdown:

    • ^ - start of string
    • 4 - literal 4
    • (?:\D*\d){15} - 15 occurrences of sequences of...
      • \D* - 0 or more non-digit symbols before..
      • \d - a digit
    • $ - end of string

    If you need to capture, you can capture (like ^4((?:\D*\d){3})((?:\D*\d){4})((?:\D*\d){4})((?:\D*\d){4})$), but the submatches will still contain the "junk" in-between digits.