В этом посте я предлагаю рассмотреть валидацию 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.