Regex - это слишком много
Если у вас в игре ограниченное количество не двусмысленных форматов, просто попробуйте выполнить синтаксический анализ с классами LocalDate
& DateTimeFormatter
.Это то, для чего они были созданы.
Определение шаблонов форматирования для соответствия ожидаемым входным данным.
List < String > inputs = List.of( "02/23/2019" , "02-27-2019" , "07|07|2022" );
List < DateTimeFormatter > formatters =
List.of(
DateTimeFormatter.ofPattern( "MM/dd/uuuu" ) ,
DateTimeFormatter.ofPattern( "MM-dd-uuuu" )
);
Соберите результаты вместе с неверными (неожиданными) входными данными.
List < LocalDate > results = new ArrayList <>( inputs.size() );
List < String > faultyInputs = new ArrayList <>();
Цикл входов.Для каждой строки выполните цикл определенных вами форматеров.Если один форматтер успешно (соответствует формату вашего ввода и успешно анализирует), собрать результат.В противном случае, если ни один из форматеров не соответствует входному значению, соберите ошибочный ввод.
for ( String input : inputs )
{
LocalDate ld = null;
for ( DateTimeFormatter formatter : formatters )
{
try
{
ld = LocalDate.parse( input , formatter );
results.add( ld );
break; // Bail-out of looping the formatters. If a format matched, no need to try others.
} catch ( DateTimeParseException e )
{
// Swallow exception. No code needed here.
}
}
if ( Objects.isNull( ld ) ) // If we tried all the expected formats but not matched our input…
{
faultyInputs.add( input );
}
}
Дамп на консоль.
System.out.println( "results:" );
System.out.println( results );
System.out.println( "faultyInputs:" );
System.out.println( faultyInputs );
результаты:
[2019-02-23, 2019-02-27]
неисправные Входы:
[07 | 07 | 2022]
ISO 8601
Совет: Обучите любого, кто производит такие данные, радостям ISO 8601 .Обмен значениями даты и времени в текстовом формате с использованием локализованных или изобретенных форматов - плохая практика.
О java.time
java.timeФреймворк встроен в Java 8 и более поздние версии.Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date
, Calendar
и & SimpleDateFormat
.
Чтобы узнать больше, см. Oracle Tutorial .И поиск переполнения стека для многих примеров и объяснений.Спецификация: JSR 310 .
Проект Joda-Time , теперь в режиме обслуживания , рекомендует перейти на java.time классы.
Вы можете обмениваться java.time объектами напрямую с вашей базой данных.Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии.Нет необходимости в строках, нет необходимости в java.sql.*
классах.
Где получить классы java.time?
ThreeTen-Extra Проект расширяет java.time дополнительными классами.Этот проект является полигоном для возможных будущих дополнений к java.time.Здесь вы можете найти несколько полезных классов, таких как Interval
, YearWeek
, YearQuarter
и more .