2016-12-17 5 views
0

Я хочу, чтобы проверить, является ли IP-адрес между 172.16.0.0 и 172.31.255.255Регулярное выражение для проверки IP

То, что я попытался это:

Pattern address = Pattern.compile("172.[16-31].[0-255].[0-255]"); 

Но это не работает, компилятор выдает сообщение об ошибке:

Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal character range near index 8 
172.[16-31].[0-255].[0-255] 
     ^

Поскольку это упражнение, это должно выполняться с регулярными выражениями.

+4

Вы должны прочитать регулярное выражение учебника чтобы понять, как работает '[]'. Он не выполняет сравнение числового диапазона, он предназначен для сопоставления одиночных символов. – Barmar

+2

'[16-31]' означает совпадение с одним символом, который является либо «1», либо в диапазоне от «6» до «3» (что не имеет смысла, поскольку диапазон должен быть низким и высоким) , – Barmar

+1

Чтобы соответствовать числу от 16 до 31, оно должно быть '(1 [6-9] | 2 [0-9] | 3 [01])'. – Barmar

ответ

3

Один из вариантов здесь будет разделить IP-адрес на период, а затем проверить, чтобы убедиться, что каждый компонент находится в пределах диапазонов вы хотите:

public boolean isIpValid(String input) { 
    String[] parts = input.split("\\."); 
    int c1 = Integer.parseInt(parts[0]); 
    int c2 = Integer.parseInt(parts[1]); 
    int c3 = Integer.parseInt(parts[2]); 
    int c4 = Integer.parseInt(parts[3]); 

    if (c1 == 172 && 
     c2 >= 16 && c2 <= 31 && 
     c3 >= 0 && c3 <= 255 && 
     c4 >= 0 && c4 <= 255) { 
     System.out.println("IP address is valid."); 
     return true; 
    } else { 
     System.out.println("IP address is not valid."); 
     return false; 
    } 
} 
+0

Спасибо за ваш ответ. Я вижу, что это проще, но поскольку это упражнение, я должен делать это с помощью регулярного выражения. – Codey

3

Причина ваше регулярное выражение не работает в том, что группа символов [16-31] означает

"character 1 , any character between 6 and 3 , or character 1 "

Это, безусловно, не то, что вы хотите, чтобы описать. Лечение чисел в языке регулярных выражений трудно - например, от 16 до 31 (1[6-9]|2\d|3[01]), т.е. «1 с последующим 6 через 9, 2 следуют любой цифры или 3 с последующим 0 или 1». Вам понадобится аналогичное выражение для описания чисел в диапазоне 0..255: (25[0-5]|2[0-4]\d|[01]?\d\d?).

Много лучше было бы использовать InetAddress, который имеет метод getByName для разбора адреса, и позволяет исследовать байты адреса с getAddress() методом:

byte[] raw = InetAddress.getByName(ipAddrString).getAddress(); 
boolean valid = raw[0]==172 && raw[1] >= 16 && raw[1] <= 31; 
+0

Для полноты, период между номером должен быть экранирован с помощью косых черт перед ним. Период без косых черт означает любой символ и позволяет любому персонажу. – ProgrammersBlock