Вы можете сделать регулярное выражение для различных форматов, например так:
(fmt1)|(fmt2)|....
Где fmt1 , fmt2 и т. Д. Являются отдельными регулярными выражениями, например,
(20\d\d-[01]\d-[0123]\d)|((?MON|TUE|WED|THU|FRI|SAT|SUN) [0123]\d [01]\d 20\d\d)
Обратите внимание, что для предотвращения возможности совпадения произвольных чисел я ограничил номера года, месяца и дня соответственно.Например, номер дня не может начинаться с 4, номер месяца также не может начинаться с 2.
Это дает следующий псевдокод:
// remember that you need to double each backslash when writing the
// pattern in string form
Pattern p = Pattern.compile("..."); // compile once and for all
String s;
for each line
s = current input line;
Matcher m = p.matcher(s);
if (m.find()) {
String d = m.group(); // d is the string that matched
....
}
Каждый отдельный шаблон даты записывается в (), чтобы можно было выяснить, какой у нас был формат, например:
int fmt = 0;
// each (fmt) is a group, numbered starting with 1 from left to right
for (int i = 1; fmt == 0 && i <= total number of different formats; i++)
if (m.group(i) != null) fmt = i;
Чтобы это работало, внутренние (регулярные выражения) группы должны быть записаны (? регулярные выражения), чтобы они не учитывались как захват-групп, посмотрите на обновленный пример.