Валидация времени в 12-ти часовом формате с помощью регулярного выражения в Java

Статья содержит пример класса для валидации времени в 12-ти часовом формате с помощью регулярного выражения. Тестирование класса будет производиться средствами библиотеки TestNG.

Регулярное выражение для времени в 12-ти часовом формате

(1[012]|[1-9]):[0-5][0-9](\s)?(?i)(am|pm)

Описание регулярного выражения:

(          # Начало группы 1
 1[012]            #  Строка должна начинаться с 10, 11 или 12.
 |         #  Или
 [1-9]             #  Строка должна начинаться с 1, 2, ..., 9.
)          # Конец группы 1
 :         #    Дальше должно быть двоетояие (:)
  [0-5][0-9]      # После чего должна быть одна из цифр 0...5, а за ней - одна из цифр 0...9.
                  # Это означает все множество чисел от 00 до 59.
            (\s)?      # После этого идет необязательный пробел.
                  (?i)      # Данный маркер указывает на то, что следующая проверка будет нечувствительной к регистру
                      (am|pm)      # И заканчивается все это на am или pm.

Корректные форматы времени

Исходя из составленного регулярного выражения, валидацию будут проходить следующие форматы времени (обратите внимание, что мы пользуемся 12-ти часовым форматом времени с применением англоязычных am и pm для обозначения времени до и после полудня соответственно):

  • 1:00am, 1:00 am, 1:00 AM;
  • 1:00pm, 1:00 pm, 1:00 PM;
  • 12:50 pm.

Некорректные форматы времени

Наше регулярное выражение будет считать следующие форматы времени некорректными:

  • 0:00 am – недопустимое значение для часов, часы должны быть в интервале от 1 до 12 включительно;
  • 10:00  am – если и есть пробел, то он должен быть только один;
  • 1:00 – должно заканчиваться либо с am, либо с pm;
  • 23:00 am – время обязательно должно быть указано в 12-ти часовом формате;
  • 1:61 pm – минуты выходят за допустимые пределы: от 0 до 59;
  • 13:00 pm – часы выходят за допустимые пределы: от 1 до 12;
  • 001:50 pm – неправильный формат часов, должно быть 2 цифры;
  • 10:99 am – минуты выходят за допустимые пределы: от 0 до 59;
  • 1:00 bm – должно заканчиваться на am или pm.

Класс для валидации времени в 12-ти часовом формате

package ru.j4web.examples.java.regex.regextime12hoursvalidator;

import java.util.regex.Pattern;

public class Time12HoursValidator {

    private static final String REGEX_12_HOURS_PATTERN
            = "(1[012]|[1-9]):[0-5][0-9](\s)?(?i)(am|pm)";

    private final Pattern pattern;

    public Time12HoursValidator() {
        pattern = Pattern.compile(REGEX_12_HOURS_PATTERN);
    }

    public boolean validate(String time) {
        return pattern.matcher(time).matches();
    }
}

Тестирование регулярного выражения

package ru.j4web.examples.java.regex.regextime12hoursvalidator;

import org.junit.Assert;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.testng.annotations.Test;

public class Time12HoursValidatorTest {

    private static Time12HoursValidator validator;

    @BeforeClass
    public static void setUpClass() throws Exception {
        validator = new Time12HoursValidator();
    }

    @DataProvider
    public Object[][] valid12HoursTimeProvider() {
        return new Object[][]{
            new Object[]{"1:00am"},
            new Object[]{"1:00 am"},
            new Object[]{"1:00 AM"},
            new Object[]{"1:00pm"},
            new Object[]{"1:00 pm"},
            new Object[]{"1:00 PM"},
            new Object[]{"12:50 pm"},};
    }

    @DataProvider
    public Object[][] invalid12HoursTimeProvider() {
        return new Object[][]{
            new Object[]{"0:00 am"},
            new Object[]{"10:00  am"},
            new Object[]{"1:00"},
            new Object[]{"23:00 am"},
            new Object[]{"1:61 pm"},
            new Object[]{"13:00 pm"},
            new Object[]{"001:50 pm"},
            new Object[]{"10:99 am"},
            new Object[]{"1:00 bm"}
        };
    }

    @Test(dataProvider = "valid12HoursTimeProvider")
    public void valid12HoursTimeTest(String time) {
        boolean valid = validator.validate(time);
        System.out.println("Time "" + time + "" is valid: " + valid);
        Assert.assertTrue(valid);
    }

    @Test(dataProvider = "invalid12HoursTimeProvider",
            dependsOnMethods = "valid12HoursTimeTest")
    public void invalid12HoursTimeTest(String time) {
        boolean valid = validator.validate(time);
        System.out.println("Time "" + time + "" is valid: " + valid);
        Assert.assertFalse(valid);
    }
}

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running ru.j4web.examples.java.regex.regextime12hoursvalidator.Time12HoursValidatorTest
Time "1:00am" is valid: true
Time "1:00 am" is valid: true
Time "1:00 AM" is valid: true
Time "1:00pm" is valid: true
Time "1:00 pm" is valid: true
Time "1:00 PM" is valid: true
Time "12:50 pm" is valid: true
Time "0:00 am" is valid: false
Time "10:00  am" is valid: false
Time "1:00" is valid: false
Time "23:00 am" is valid: false
Time "1:61 pm" is valid: false
Time "13:00 pm" is valid: false
Time "001:50 pm" is valid: false
Time "10:99 am" is valid: false
Time "1:00 bm" is valid: false
Tests run: 16, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.486 sec

Results :

Tests run: 16, Failures: 0, Errors: 0, Skipped: 0

------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 2.945s
Finished at: Tue Oct 06 18:17:00 GMT+03:00 2015
Final Memory: 16M/125M
------------------------------------------------------------------------

Оставить комментарий

Ваш email нигде не будет показанОбязательные для заполнения поля помечены *

*