Возможно, вы делаете web-приложение для управления хостингом или хотите разработать для своей социальной сети систему бана по IP-адресу, чтобы запрещать доступ к своему ресурсу злостным спамерам. В этих случаях, чтобы не ошибиться при вводе IP-адреса, вам понадобится проверять IP-адрес перед сохранением его в базу данных.
Предлагаю использовать для этой цели валидацию с помощью регулярного выражения, которое рассмотрено ниже.
Unit-тест написан с использованием библиотеки TestNG 5.10. Как запустить тесты TestNG в Eclipse читайте здесь.
Выражение:
^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$
Комментарий:
^ # начало строки ( # начало первой группы [01]?\\d\\d? # Может быть одна или две цифры. Если три цифры, то группа должна начинаться с 0 или 1 | # или 2[0-4]\\d # начинается с 2, далее 0-4 и оканчивается любой цифрой (2[0-4][0-9]) | # или 25[0-5] # начинается с 2, далее 5 и оканчивается на 0-5 (25[0-5]) ) # конец первой группы \. # далее "." .... # повторить 3 раза $ # конец строки
Пример на Java:
package ru.topcode.skillbase.regexp; import java.util.regex.Matcher; import java.util.regex.Pattern; public class IPAddressValidator { private Pattern pattern; private Matcher matcher; private static final String IPADDRESS_PATTERN = "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$"; public IPAddressValidator() { pattern = Pattern.compile(IPADDRESS_PATTERN); } /** * Валидирует IP-адрес с помощью решулярного выражения * * @param ip IP-адрес для валидации * @return true если адрес валидный, false если адрес не валидный */ public boolean validate(final String ip) { matcher = pattern.matcher(ip); return matcher.matches(); } }
Unit Test:
package ru.topcode.skillbase.regexp.test; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.DataProvider; import org.testng.annotations.Test; import ru.topcode.skillbase.regexp.IPAddressValidator; public class IPAddressValidatorTest { private IPAddressValidator ipAddressValidator; @BeforeClass public void initData() { ipAddressValidator = new IPAddressValidator(); } @DataProvider public Object[][] ValidIPAddressProvider() { return new Object[][] { new Object[] { "1.1.1.1" }, new Object[] { "255.255.255.255" }, new Object[] { "192.168.1.1" }, new Object[] { "10.10.1.1" }, new Object[] { "132.254.111.10" }, new Object[] { "26.10.2.10" }, new Object[] { "127.0.0.1" } }; } @DataProvider public Object[][] InvalidIPAddressProvider() { return new Object[][] { new Object[] { "10.10.10" }, new Object[] { "10.10" }, new Object[] { "10" }, new Object[] { "a.a.a.a" }, new Object[] { "10.0.0.a" }, new Object[] { "10.10.10.256" }, new Object[] { "222.222.2.999" }, new Object[] { "999.10.10.20" }, new Object[] { "2222.22.22.22" }, new Object[] { "22.2222.22.2" }, new Object[] { "10.10.10" }, new Object[] { "10.10.10" }, }; } @Test(dataProvider = "ValidIPAddressProvider") public void ValidIPAddressTest(String ip) { boolean valid = ipAddressValidator.validate(ip); System.out.println("Валидность IP : " + ip + " , " + valid); Assert.assertEquals(true, valid); } @Test(dataProvider = "InvalidIPAddressProvider", dependsOnMethods = "ValidIPAddressTest") public void InValidIPAddressTest(String ip) { boolean valid = ipAddressValidator.validate(ip); System.out.println("Валидность IP : " + ip + " , " + valid); Assert.assertEquals(false, valid); } }
Результат выполнения теста:
Валидность IP : 1.1.1.1 , true Валидность IP : 255.255.255.255 , true Валидность IP : 192.168.1.1 , true Валидность IP : 10.10.1.1 , true Валидность IP : 132.254.111.10 , true Валидность IP : 26.10.2.10 , true Валидность IP : 127.0.0.1 , true Валидность IP : 10.10.10 , false Валидность IP : 10.10 , false Валидность IP : 10 , false Валидность IP : a.a.a.a , false Валидность IP : 10.0.0.a , false Валидность IP : 10.10.10.256 , false Валидность IP : 222.222.2.999 , false Валидность IP : 999.10.10.20 , false Валидность IP : 2222.22.22.22 , false Валидность IP : 22.2222.22.2 , false Валидность IP : 10.10.10 , false Валидность IP : 10.10.10 , false PASSED: ValidIPAddressTest("1.1.1.1") PASSED: ValidIPAddressTest("255.255.255.255") PASSED: ValidIPAddressTest("192.168.1.1") PASSED: ValidIPAddressTest("10.10.1.1") PASSED: ValidIPAddressTest("132.254.111.10") PASSED: ValidIPAddressTest("26.10.2.10") PASSED: ValidIPAddressTest("127.0.0.1") PASSED: InValidIPAddressTest("10.10.10") PASSED: InValidIPAddressTest("10.10") PASSED: InValidIPAddressTest("10") PASSED: InValidIPAddressTest("a.a.a.a") PASSED: InValidIPAddressTest("10.0.0.a") PASSED: InValidIPAddressTest("10.10.10.256") PASSED: InValidIPAddressTest("222.222.2.999") PASSED: InValidIPAddressTest("999.10.10.20") PASSED: InValidIPAddressTest("2222.22.22.22") PASSED: InValidIPAddressTest("22.2222.22.2") PASSED: InValidIPAddressTest("10.10.10") PASSED: InValidIPAddressTest("10.10.10") =============================================== ru.topcode.skillbase.regexp.test.IPAddressValidatorTest Tests run: 19, Failures: 0, Skips: 0 ===============================================
Для углубленного изучения регулярных выражений в Java рекомендую посетить соответствующий раздел The Java Tutorials и изучить книги из раздела RegExp в библиотеке TopCode.


