import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "([ :]) # look for : and space as possible leading characters\n"
+ "([\\\"]?) # if there's a quote, disregard it\n"
+ "([0-9]{4}) # find the year\n"
+ "- # find the 1st dash\n"
+ "( # Group (4)\n"
+ " (\n"
+ " ((0[13578] | (10|12)) # look for 31 day months\n"
+ " - # followed by the 2nd dash\n"
+ " (0[1-9]|[1-2][0-9]|3[0-1]) # and accept days up to 31\n"
+ " ) \n"
+ " | # OR... \n"
+ " (02 # look for Feb\n"
+ " - # followed by the 2nd dash\n"
+ " (0[1-9]|[1-2][0-9])) # and accept up to 29 days\n"
+ " | # OR...\n"
+ " ((0[469]|11)) # look for 30 day months\n"
+ " - # followed by the 2nd dash\n"
+ " ((0[1-9]|[1-2][0-9]|30)) # and accept up to 30 days\n"
+ " )\n"
+ ") # closes (4)\n"
+ "([\\\"]?)([ \\\"]?)(\\s)";
final String string = "This regex changes YYYY-MM-DD to \"[[YYYY-MM-DD]]\" for Obsidian\n"
+ "WORKS ON:\n"
+ "today: 2025-03-14\n"
+ "birthdays: 1966-06-19\n"
+ "Good Dates: 2022-12-31 and 2025-02-08\n"
+ "old-dates: 1492-01-01 old dates could be an issue, depends on how you use your vault!\n"
+ "no space after colon is ok:2023-07-08\n"
+ "standing alone and quoted is fine: \"2021-02-28\"\n"
+ "IGNORES:\n"
+ "my template version number has dots for separators (skip): 2025.12.02\n"
+ "No leading whitespace is questionable?2023-06-08\n"
+ "existing links (no leading : or space):\n"
+ " - [[2025-01-01]]\n"
+ "- [2025-01-01](https:123.com)\n"
+ " - \"[[2023-11-30]]\"\n"
+ " - [[\"2024-06-05\"]]\n"
+ "Not YYYY-MM-DD dates:- 2022-1-1 Euro date: 2022-31-12 or slashes: 2021/09/15\n"
+ "Bad date for month: 2022-02-30 2022-04-31 2022-06-31 2022-11-31 2022-03-32\n"
+ "Don't match serial numbers: 2015-12-3135-89\n";
final String subst = "$1\"[[$3-$4]]\"$18";
final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.COMMENTS);
final Matcher matcher = pattern.matcher(string);
// The substituted value will be contained in the result variable
final String result = matcher.replaceAll(subst);
System.out.println("Substitution result: " + result);
}
}
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