Валидация IP адреса с помощью регулярного выражения в Java

В данной статье мы рассмотрим пример простой программы, которая производит валидацию IP адреса с помощью регулярного выражения. Тестирование созданного класса мы будет производить средствами библиотеки TestNG.

Регулярное выражение для валидации IP адреса

^([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])$

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

^        # Начало Строки
 (       #  Начало группы 1
   [01]?\d\d?   #    Может быть одна или 2 цифры. Если цифр три, то первой цифрой должно быть 0 или 1,
                  #    то есть ([0-9], [0-9][0-9],[0-1][0-9][0-9]).
    |             #    Или
   2[0-4]\d      #    Начинается с цифры 2, потом идет цифра от 0 до 4, а заканчивается - любой цифрой, то есть (2[0-4][0-9]). 
    |             #    Или
   25[0-5]        #    Начинается с цифры 2, потом - 5, а в конце должна быть цифра от 0 до 5, то есть (25[0-5]).
 )       #  Окончание группы 1
  .     # Далее должна быть точка "."
....     # Повторяем то же самое еще три раза.
$        # Конец строки

Полностью это регулярное выражение означает буквально следующее: числа в интервале от 0 до 255 с последующей точкой («.») должны повторяться 4 раза, но в конце строки точки быть не должно. Корректными IP адресами являются все строки условного вида: 0-255.0-255.0-255.0-255.

Корректные IP адреса

С точки зрения составленного регулярного выражения корректными IP адресами будут являться:

  • 1.1.1.1, 255.255.255.255, 192.168.1.1;
  • 10.10.1.1, 132.254.111.10, 26.10.2.10;
  • 127.0.0.1.

Некорректные IP адреса

С точки зрения нашего регулярного выражения некорректными IP адресами будут являться:

  • 10.10.10 – IP адрес должен содержать 4 числа;
  • 10.10 – IP адрес должен содержать 4 числа;
  • 10 – IP адрес должен содержать 4 числа;
  • a.a.a.a – IP адрес может содержать только числа;
  • 10.0.0.a – IP адрес может содержать только числа;
  • 10.10.10.256 – IP адрес может содержать только числа в интервале от 0 до 255;
  • 222.222.2.999 – IP адрес может содержать только числа в интервале от 0 до 255;
  • 999.10.10.20 – IP адрес может содержать только числа в интервале от 0 до 255;
  • 2222.22.22.22 – IP адрес может содержать только числа в интервале от 0 до 255;
  • 22.2222.22.2 – IP адрес может содержать только числа в интервале от 0 до 255.

Пример валидации IP адреса с помощью регулярного выражения

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

import java.util.regex.Pattern;

public class IPAddressValidator {

    private static final String IP_ADDRESS_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])$";

    private final Pattern pattern;

    public IPAddressValidator() {
        pattern = Pattern.compile(IP_ADDRESS_PATTERN);
    }

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

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

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

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

public class IPAddressValidatorTest {

    private IPAddressValidator validator;

    public IPAddressValidatorTest() {
    }

    @BeforeClass
    public void setUpClass() throws Exception {
        validator = 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"}
        };
    }

    @Test(dataProvider = "validIpAddressProvider")
    public void validIpAddressTest(String ipAddress) {
        boolean result = validator.validate(ipAddress);
        System.out.println("IP address "" + ipAddress + "" is valid: "
                + result);
        Assert.assertTrue(result);
    }

    @Test(dataProvider = "invalidIpAddressProvider",
            dependsOnMethods = "validIpAddressTest")
    public void invalidAddressTest(String ipAddress) {
        boolean result = validator.validate(ipAddress);
        System.out.println("IP address "" + ipAddress + "" is valid: "
                + result);
        Assert.assertFalse(result);
    }
}
-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running ru.j4web.examples.java.regex.regexipaddressexample.IPAddressValidatorTest
IP address "1.1.1.1" is valid: true
IP address "255.255.255.255" is valid: true
IP address "192.168.1.1" is valid: true
IP address "10.10.1.1" is valid: true
IP address "132.254.111.10" is valid: true
IP address "26.10.2.10" is valid: true
IP address "127.0.0.1" is valid: true
IP address "10.10.10" is valid: false
IP address "10.10" is valid: false
IP address "10" is valid: false
IP address "a.a.a.a" is valid: false
IP address "10.0.0.a" is valid: false
IP address "10.10.10.256" is valid: false
IP address "222.222.2.999" is valid: false
IP address "999.10.10.20" is valid: false
IP address "2222.22.22.22" is valid: false
IP address "22.2222.22.2" is valid: false
Tests run: 17, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.512 sec

Results :

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

------------------------------------------------------------------------
BUILD SUCCESS
------------------------------------------------------------------------
Total time: 2.296s
Finished at: Tue Oct 06 14:58:16 GMT+03:00 2015
Final Memory: 6M/123M
------------------------------------------------------------------------

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

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

*