import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(?# This regex was created for the purposes of detecting potentially compromised credentials for the purposes of information security and not to be used for malicious purposes.)\n"
+ "(?<!\\d)\n"
+ "(?# s - Short [less than 16 digits], m - Medium [16 digits], l - Long [more than 16 digits; not yet implemented])\n"
+ "(?# First four digits)\n"
+ "(?:\n"
+ " (?# Standard 16 digit numbers)\n"
+ " (?<m>\n"
+ " (?#MasterCard between 222100-272099)\n"
+ " 222[1-9]|223\\d|2[3-6]\\d{2}|27[01]\\d|2720|\n"
+ " (?#JCB is between 3528-3589)\n"
+ " 352[89]|35[3-8]\\d|\n"
+ " (?#Visa, MasterCard, Discover)\n"
+ " [4-6]\\d{3}\n"
+ " )|\n"
+ " (?#American Express 15 digits | Diners Club 14 digits)\n"
+ " (?<s>(?<ax>3[47]\\d{2})|(?<dc>30[0-5]\\d|36\\d{2}))\n"
+ ")\n"
+ "(?# Rest of the card number)\n"
+ "(?<del>\\D+)?(?(<m>)\\d{4}(?(<del>)\\k\\{del\\})\\d{4}(?(<del>)\\k\\{del\\})\\d{4}|(?:\\d{6})(?(<del>)\\k\\{del\\})(?(<ax>)\\d{5}|\\d{4}))\n"
+ "(?#END)\n"
+ "(?!\\d)";
final String string = "# Based on data from https://www.freeformatter.com/credit-card-number-generator-validator.html\n\n"
+ "# Currently only works for Visa, MasterCard, Discover, AmEx, JCB, Diners Club and only 16 digits (15 for AmEx, 14 for Diners Club Int'l)\n\n"
+ "# VISA:\n"
+ "4600259666104540\n"
+ "4556-1328-5230-3974\n"
+ "4485733989514555546\n"
+ "# MasterCard:\n"
+ "5288718104904007\n"
+ "5183-2272-0427-5165\n"
+ "2221001473307772\n"
+ "# American Express (AMEX):\n"
+ "379094106835131\n"
+ "3767-607295-33484\n"
+ "345614253532917\n"
+ "# Discover:\n"
+ "6011277600566135\n"
+ "6011-7825-5703-7196\n"
+ "6011621290066569622\n"
+ "# JCB:\n"
+ "3542928645179210\n"
+ "3538837785961400\n"
+ "3540948375054149466\n"
+ "# Diners Club - North America:\n"
+ "5440569380986811\n"
+ "5500771351399605\n"
+ "5555244536769443\n"
+ "# Diners Club - Carte Blanche:\n"
+ "30360146296936\n"
+ "30381212693491\n"
+ "30178078889506\n"
+ "# Diners Club - International:\n"
+ "36760821695498\n"
+ "36861772048826\n"
+ "36442207191455\n"
+ "# Maestro:\n"
+ "6759789245430267\n"
+ "5893000324731008\n"
+ "5038101669768864\n"
+ "# Visa Electron:\n"
+ "4026108950062250\n"
+ "4913708902962931\n"
+ "4844361267840716\n"
+ "# InstaPayment:\n"
+ "6370603085892230\n"
+ "6390038329060763\n"
+ "6395957073920994";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.COMMENTS);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Java, please visit: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html