Я пытаюсь создать регулярное выражение, соответствующее IPv4.
У меня есть этот код
//numbers from 10 to 99
String r10to99 = "[1-9][0-9]";
//numbers from 100 to 199
String r100to199 = "1[0-9][0-9]";
//numbers from 200 to 255
String r200to255 = "2[0-4][0-9]|25[0-5]";
//combine all - numbers from 0 to 255
String r0to255 = "[0-9]|" + r10to99 + "|" + r100to199 + "|" + r200to255;
String regexIP = r0to255 + "[.]" + r0to255 + "[.]" + r0to255 + "[.]" + r0to255;
System.out.println("15.15.15.15".matches(regexIP)); //->false - should be true
System.out.println("15".matches(regexIP)); //->true - should be false
Моя проблема в regexIP. Соответствует только числам от 0 до 255. Как r0to255.
Как объединить несколько r0to255 с .(dot) между ними?
r0to255.r0to255.r0to255.r0to255




Вам нужно сгруппировать эти паттерны, смотрите исправленный код:
String r10to99 = "[1-9][0-9]"; //numbers from 10 to 99
String r100to199 = "1[0-9][0-9]"; //numbers from 100 to 199
String r200to255 = "2[0-4][0-9]|25[0-5]"; //numbers from 200 to 255
//combine all - numbers from 0 to 255
String r0to255 = "(?:[0-9]|" + r10to99 + "|" + r100to199 + "|" + r200to255 + ")";
String regexIP = r0to255 + "(?:[.]" + r0to255 + "){3}";
System.out.println("15.15.15.15".matches(regexIP)); // true
System.out.println("15".matches(regexIP)); // false
Здесь "(?:[0-9]|" + r10to99 + "|" + r100to199 + "|" + r200to255 + ")" группирует r10to99, r100to199 и r200to255, так что внутри более крупного шаблона (с использованием группа без захвата) | не разрушит весь шаблон.
Паттерн r0to255 + "(?:[.]" + r0to255 + "){3}" на самом деле является паттерном r0to255, за которым следуют три последовательности: . и паттерн r0to255.
@ raul1ro Вы правы, но шаблон ababab слишком многословен, нотация (?:ab){3} проще и удобнее в обслуживании. Что ж, решать только вам.
Для полноты картины, конечно, у Apache уже есть решение для этого.
Я знаю это, но почему неправильно пытаться реализовать мой собственный метод? Пытаясь найти для этого регулярное выражение, я узнал новое.
Использование
?:вr0to255означает разрешить все без изменения моего regexP. Надо при?:использоватьregexIP?