Соответствие регулярных выражений Java Дата, разделенная точками

У меня есть регулярное выражение [d\d[.]dd[.]dd] и [\d\d\.\d\d\.\d\d].* кто правильно соответствует строкам с датами, но также соответствует строкам, не содержащим даты, а только номеру (и тексту) 12.04 . 18 , 15 : 59 - A : xyz 12345 abc 12.04 . 18 , 16 : 00 - B : cde abc 12345

Мой текстовый формат выглядит следующим образом:

dd.dd.dd.*$

Я хочу, чтобы регулярное выражение соответствовало строкам 1 и 3

java,regex,date,

-2

Ответов: 2


0

Вам нужно избежать символа периода, поскольку он рассматривается как шаблон в регулярном выражении. Кроме того, вы используете класс символов, где он не нужен. Классы символов обозначаются квадратными скобками и используются для составления списка принятых символов для этой позиции. Проверьте это регулярное выражение:

d

Демо здесь

объяснение

  • . ищет цифру, как вы знаете
  • .ищет литеральный .характер, а не регулярное выражение периода как wild card
  • .* используется для соответствия оставшейся части строки после совпадения даты
  • $ указывает конец линии, убедившись, что мы сопоставили всю строку.

0

Обычная рекомендация заключается не в том, чтобы использовать регулярное выражение для проверки строки даты, но использовать формат времени даты из стандартной библиотеки. В вашем случае это может быть не обязательно, но я хотел бы представить его как вариант как для вас, так и для тех, кто читает.

    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.uu, H:mm");
    String[] lines = {
            "12.04.18, 15:59 - A: xyz",
            "12345 abc",
            "12.04.18, 16:00 - B: cde",
            "abc 12345"
    };
    for (String line : lines) {
        ParsePosition pos = new ParsePosition(0);
        try {
            LocalDateTime dateTime = LocalDateTime.from(formatter.parse(line, pos));
            System.out.println("Match. Date-time is " + dateTime 
                    + ". Remainder of line is: " + line.substring(pos.getIndex()));
        } catch (DateTimeParseException dtpe) {
            System.out.println("No match. Line was: " + line);
        }
    }

Вышеприведенный фрагмент печатает:

Match. Date-time is 2018-04-12T15:59. Remainder of line is:  - A: xyz
No match. Line was: 12345 abc
Match. Date-time is 2018-04-12T16:00. Remainder of line is:  - B: cde
No match. Line was: abc 12345

Потенциальные преимущества:

  • Это дает более строгую проверку того, что числа составляют действительную дату и время.
  • Это яснее из кода, на который проверяются дата-время. Регулярные выражения немного сложнее читать и писать правильно.
  • Вы получаете дату и время в качестве объекта с датой, который будет удобен для дальнейшей обработки, если вам понадобится.
ява, регулярное выражение, дата,
Похожие вопросы
Яндекс.Метрика