import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "# Leap Years are any year that can be evenly divided by 4 \n"
+ "# (such as 2012, 2016, etc)\n"
+ "# • except if it can be evenly divided by 100\n"
+ "# then it isn't (such as 2100, 2200, etc)\n"
+ "# • except if it can be evenly divided by 400,\n"
+ "# then it is (such as 2000, 2400)\n"
+ "# https://www.mathsisfun.com/leap-years.html\n"
+ "# -------------------------------------------------\n"
+ "# verify date dd/mm/yyyy; possible separators: -.,/\n"
+ "# valid year range: 0000-9999\n\n"
+ "^ # start anchor\n\n"
+ "# precheck xx-xx-xxxx,... add new separators here\n"
+ "(?=\\d{2}([-.,\\/])\\d{2}\\1\\d{4}$)\n\n"
+ "(?: # day-check: non caturing group\n\n"
+ " # days 01-28\n"
+ " 0[1-9]|1\\d|[2][0-8]| \n\n"
+ " # february 29d check for leap year: all 4y / 00 years: only each 400\n"
+ " # 0400,0800,1200,1600,2000,...\n"
+ " 29\n"
+ " (?!.02. # not if feb: if not ...\n"
+ " (?!\n"
+ " # 00 years: exclude !0 %400 years\n"
+ " (?!(?:[02468][1-35-79]|[13579][0-13-57-9])00)\n\n"
+ " # 00,04,08,12,... \n"
+ " \\d{2}(?:[02468][048]|[13579][26])\n"
+ " )\n"
+ " )|\n\n"
+ " # d30 negative lookahead: february cannot have 30 days\n"
+ " 30(?!.02)|\n\n"
+ " # d31 positive lookahead: month up to 31 days\n"
+ " 31(?=.(?:0[13578]|10|12))\n\n"
+ ") # eof day-check\n\n"
+ "# month 01-12\n"
+ ".(?:0[1-9]|1[012])\n\n"
+ "# year 0000-9999\n"
+ ".\\d{4}\n\n"
+ "$ # end anchor";
final String string = "29/02/0000\n"
+ "29/02/0100\n"
+ "29/02/0200\n"
+ "29/02/0300\n"
+ "29/02/0400\n"
+ "29/02/0500\n"
+ "29/02/0600\n"
+ "29/02/0700\n"
+ "29/02/0800\n"
+ "29/02/0900\n"
+ "29/02/1000\n"
+ "29/02/1100\n"
+ "29/02/1200\n"
+ "29/02/1300\n"
+ "29/02/1400\n"
+ "29/02/1500\n"
+ "29/02/1600\n"
+ "29/02/1700\n"
+ "29/02/1800\n"
+ "29/02/1900\n"
+ "29/02/2000\n"
+ "29/02/2100\n"
+ "29/02/2200\n"
+ "29/02/2300\n"
+ "29/02/2400\n"
+ "29/02/2500";
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