В этом посте я предлагаю рассмотреть валидацию 12-часового и 24-часового форматов времени.
Unit-тесты написаны с использованием библиотеки TestNG 5.10. Как запустить тесты TestNG в Eclipse читайте здесь.
Валидация 12-часового формата времени
Выражение:
(1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm)
Комментарий:
( # начало первой группы 1[012] # начинается с 10, 11, 12 | # или [1-9] # начинается с 1,2,...9 ) # конец первой группы : # двоеточие (:) [0-5][0-9] # далее следует 0..5 и 0..9, т.е. минуты от 00 до 59 (\\s)? # далее следует пробел (не обязательный) (?i) # проверка чувствительности к регистру (am|pm) # алее am или pm
Пример на Java:
package ru.topcode.skillbase.regexp; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Time12HoursValidator { private Pattern pattern; private Matcher matcher; private static final String TIME12HOURS_PATTERN = "(1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm)"; public Time12HoursValidator() { pattern = Pattern.compile(TIME12HOURS_PATTERN); } /** * Валидация 12-часового формата времени с помощью регулярного выражения * * @param time * значение времени * @return true валидный формат времени, false не валидный формат времени */ public boolean validate(final String time) { matcher = pattern.matcher(time); return matcher.matches(); } }
Unit Test:
package ru.topcode.skillbase.regexp.test; import org.testng.Assert; import org.testng.annotations.*; import ru.topcode.skillbase.regexp.Time12HoursValidator; public class Time12HoursValidatorTest { private Time12HoursValidator time12HoursValidator; @BeforeClass public void initData() { time12HoursValidator = new Time12HoursValidator(); } @DataProvider public Object[][] ValidTime12HoursProvider() { 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[][] InvalidTime12HoursProvider() { 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[] { "01:00 pm" }, new Object[] { "1:00 bm" } }; } @Test(dataProvider = "ValidTime12HoursProvider") public void ValidTime12HoursTest(String time) { boolean valid = time12HoursValidator.validate(time); System.out.println("Валидность 12-часового формата : " + time + " , " + valid); Assert.assertEquals(true, valid); } @Test(dataProvider = "InvalidTime12HoursProvider", dependsOnMethods = "ValidTime12HoursTest") public void InValidTime12HoursTest(String time) { boolean valid = time12HoursValidator.validate(time); System.out.println("Валидность 12-часового формата : " + time + " , " + valid); Assert.assertEquals(false, valid); } }
Результат выполнения теста:
Валидность 12-часового формата : 1:00am , true Валидность 12-часового формата : 1:00 am , true Валидность 12-часового формата : 1:00 AM , true Валидность 12-часового формата : 1:00pm , true Валидность 12-часового формата : 1:00 pm , true Валидность 12-часового формата : 1:00 PM , true Валидность 12-часового формата : 12:50 pm , true Валидность 12-часового формата : 0:00 am , false Валидность 12-часового формата : 10:00 am , false Валидность 12-часового формата : 1:00 , false Валидность 12-часового формата : 23:00 am , false Валидность 12-часового формата : 1:61 pm , false Валидность 12-часового формата : 13:00 pm , false Валидность 12-часового формата : 001:50 pm , false Валидность 12-часового формата : 10:99 am , false Валидность 12-часового формата : 01:00 pm , false Валидность 12-часового формата : 1:00 bm , false PASSED: ValidTime12HoursTest("1:00am") PASSED: ValidTime12HoursTest("1:00 am") PASSED: ValidTime12HoursTest("1:00 AM") PASSED: ValidTime12HoursTest("1:00pm") PASSED: ValidTime12HoursTest("1:00 pm") PASSED: ValidTime12HoursTest("1:00 PM") PASSED: ValidTime12HoursTest("12:50 pm") PASSED: InValidTime12HoursTest("0:00 am") PASSED: InValidTime12HoursTest("10:00 am") PASSED: InValidTime12HoursTest("1:00") PASSED: InValidTime12HoursTest("23:00 am") PASSED: InValidTime12HoursTest("1:61 pm") PASSED: InValidTime12HoursTest("13:00 pm") PASSED: InValidTime12HoursTest("001:50 pm") PASSED: InValidTime12HoursTest("10:99 am") PASSED: InValidTime12HoursTest("01:00 pm") PASSED: InValidTime12HoursTest("1:00 bm") =============================================== ru.topcode.skillbase.regexp.test.Time12HoursValidatorTest Tests run: 17, Failures: 0, Skips: 0 ===============================================
Валидация 24-часового формата времени
Выражение:
([01]?[0-9]|2[0-3]):[0-5][0-9]
Комментарий:
( # начало первой группы [01]?[0-9] # начинается с 0-9,1-9,00-09,10-19 | # или 2[0-3] # начинается с 20-23 ) # конец первой группы : # далее двоеточие (:) [0-5][0-9] # затем 0..5 и 0..9, т.е. минуты от 00 до 59
Пример на Java:
package ru.topcode.skillbase.regexp; import java.util.regex.Matcher; import java.util.regex.Pattern; public class Time24HoursValidator { private Pattern pattern; private Matcher matcher; private static final String TIME24HOURS_PATTERN = "([01]?[0-9]|2[0-3]):[0-5][0-9]"; public Time24HoursValidator() { pattern = Pattern.compile(TIME24HOURS_PATTERN); } /** * Валидация 24-часового формата времени с помощью регулярного выражения * * @param time * время * @return true валидный формат, false не валидный формат */ public boolean validate(final String time) { matcher = pattern.matcher(time); return matcher.matches(); } }
Unit Test:
package ru.topcode.skillbase.regexp.test; import org.testng.Assert; import org.testng.annotations.*; import ru.topcode.skillbase.regexp.Time24HoursValidator; public class Time24HoursValidatorTest { private Time24HoursValidator time24HoursValidator; @BeforeClass public void initData() { time24HoursValidator = new Time24HoursValidator(); } @DataProvider public Object[][] ValidTime24HoursProvider() { return new Object[][] { new Object[] { "01:00" }, new Object[] { "02:00" }, new Object[] { "13:00" }, new Object[] { "1:00" }, new Object[] { "2:00" }, new Object[] { "13:01" }, new Object[] { "23:59" }, new Object[] { "15:00" }, new Object[] { "00:00" }, new Object[] { "0:00" } }; } @DataProvider public Object[][] InvalidTime24HoursProvider() { return new Object[][] { new Object[] { "24:00" }, new Object[] { "12:60" }, new Object[] { "0:0" }, new Object[] { "13:1" }, new Object[] { "101:00" } }; } @Test(dataProvider = "ValidTime24HoursProvider") public void ValidTime24HoursTest(String time) { boolean valid = time24HoursValidator.validate(time); System.out.println("Валидность 24-часового формата : " + time + " , " + valid); Assert.assertEquals(true, valid); } @Test(dataProvider = "InvalidTime24HoursProvider", dependsOnMethods = "ValidTime24HoursTest") public void InValidTime24HoursTest(String time) { boolean valid = time24HoursValidator.validate(time); System.out.println("Валидность 24-часового формата : " + time + " , " + valid); Assert.assertEquals(false, valid); } }
Результат выполнения теста:
Валидность 24-часового формата : 01:00 , true Валидность 24-часового формата : 02:00 , true Валидность 24-часового формата : 13:00 , true Валидность 24-часового формата : 1:00 , true Валидность 24-часового формата : 2:00 , true Валидность 24-часового формата : 13:01 , true Валидность 24-часового формата : 23:59 , true Валидность 24-часового формата : 15:00 , true Валидность 24-часового формата : 00:00 , true Валидность 24-часового формата : 0:00 , true Валидность 24-часового формата : 24:00 , false Валидность 24-часового формата : 12:60 , false Валидность 24-часового формата : 0:0 , false Валидность 24-часового формата : 13:1 , false Валидность 24-часового формата : 101:00 , false PASSED: ValidTime24HoursTest("01:00") PASSED: ValidTime24HoursTest("02:00") PASSED: ValidTime24HoursTest("13:00") PASSED: ValidTime24HoursTest("1:00") PASSED: ValidTime24HoursTest("2:00") PASSED: ValidTime24HoursTest("13:01") PASSED: ValidTime24HoursTest("23:59") PASSED: ValidTime24HoursTest("15:00") PASSED: ValidTime24HoursTest("00:00") PASSED: ValidTime24HoursTest("0:00") PASSED: InValidTime24HoursTest("24:00") PASSED: InValidTime24HoursTest("12:60") PASSED: InValidTime24HoursTest("0:0") PASSED: InValidTime24HoursTest("13:1") PASSED: InValidTime24HoursTest("101:00") =============================================== ru.topcode.skillbase.regexp.test.Time24HoursValidatorTest Tests run: 15, Failures: 0, Skips: 0 ===============================================
Для углубленного изучения регулярных выражений в Java рекомендую посетить соответствующий раздел The Java Tutorials и изучить книги из раздела RegExp в библиотеке TopCode.


