Hey guys I am needing to meet a certain client demand for PCI . I am fairly comfortable in C and I really don't want to redo the wheel here. I have an regex example in python that I would like to have applied in C.
pan_regexs = {'Mastercard': re.compile('(?:\D|^)(5[1-5][0-9]{2}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4})(?:\D|$)'), \
'Visa': re.compile('(?:\D|^)(4[0-9]{3}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4}(?:\ |\-|)[0-9]{4})(?:\D|$)'), \
'AMEX': re.compile('(?:\D|^)((?:34|37)[0-9]{2}(?:\ |\-|)[0-9]{6}(?:\ |\-|)[0-9]{5})(?:\D|$)')}
I have found some POSIX library "regex.h " and this seems to used the really old regex standard.
I have found two examples one uses POSIX regex which seems to be limited at best. Stolen from Here
#include <regex.h>
regex_t regex;
int reti;
char msgbuf[100];
/* Compile regular expression */
reti = regcomp(®ex, "^a[[:alnum:]]", 0);
if (reti) {
fprintf(stderr, "Could not compile regex\n");
exit(1);
}
/* Execute regular expression */
reti = regexec(®ex, "abc", 0, NULL, 0);
if (!reti) {
puts("Match");
}
else if (reti == REG_NOMATCH) {
puts("No match");
}
else {
regerror(reti, ®ex, msgbuf, sizeof(msgbuf));
fprintf(stderr, "Regex match failed: %s\n", msgbuf);
exit(1);
}
/* Free memory allocated to the pattern buffer by regcomp() */
regfree(®ex);
The problem I see with the above is that it uses (from what I have gathered) Old Regex which doesn't support removing spaces and dashes.It also only really seems to perform some matching and looking for decent examples for this is not been turning many results for me in Google. So I looked further and in that answer it ( the question above) mentions the use of PCRE.
I found some demo Here
As I said before, I don't want to reinvent the wheel . I think it would be terrible to write my own regex for what could contain potential flaws when something clean and simple probably exists.
The PCI question comes from a client that we need to be able to monitor systems for how/where they are storing PANs and such. It's sort of a DLP, sphere of audit,and proving that CCNS are stored correctly.
How can I use regex in C to search for credit card numbers?
PS. I am ok with this regex, and open for better ways of doing this regex.
Ok I ended up using PCRE2 and it works remarkably well.
The source code I think I saw on Github, but it's is also Here too.
I downloaded it, compiled it , and installed it. Doing the following.. Keep in mind there is an 8,16,and a 32 bit formatting for this. All the examples I saw used the 8 bit and I found that it worked best for what I was doing.
I had to also make the libraries it produces searchable by the linked by using.
Of course when you're compiling your program you need to link your program to the library. using -lpcre2-8 the library will be named pcre2-16 , pcre2-32 if you're using these versions.
After that I compiled their example using
If you don't want to read all the things that they wrote in their gigantic example, I made my own... Warning I am stripping this apart from a few functions right now so you might want to double check for problems. The example I will provide does work however.