Поскольку вопрос таков: Нахождение лучшего шаблона регулярных выражений, а не Что такое лучший шаблон регулярных выражений, я собираюсь ответить на него. Техника, которую я использую, является более или менее подходом «разделяй и властвуй».
Сначала найдите разделители. Тогда вы можете построить свой шаблон так:
String pattern = field1() + ";" + field2() + "|" + field3();
Тогда ваши поля могут иметь типы данных. Обратите внимание, что не каждый (строковое представление) домен является регулярным! Так что проверь это первым. В вашем примере вы хотите что-то вроде этого:
String pattern = intPattern(2) + "\\." + intPattern(2) + "\\." + intPattern(4)
+ " " + intPattern(2) + ":" + intPattern(2)
+ ";" + intPattern() + ";" + doublePattern();
Где intPattern(n)
- шаблон для целого числа без знака с точно n
цифрами, intPattern()
- шаблон для произвольного числа цифр.
Преимущества:
- Вы можете проверить шаблоны по отдельности.
- Вы не получите сверхдлинное регулярное выражение, которое выглядит как беспорядок
Но ваш пример предполагает, что вы хотите больше, чем просто проверка шаблона. То, что вы хотите, это семантика. Вы хотите проверить, что dd.MM.yyyy является действительной датой. Это невозможно, потому что язык правильных дат (в общем) не является регулярным. Если вы рассматриваете только конечное подмножество дат (например, с 1990 по 2400 год), вы можете сделать это (конечные языки всегда регулярны), но это будет беспорядок.