Concat несколько регулярных выражений

Я пытаюсь создать регулярное выражение, соответствующее 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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
128
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам нужно сгруппировать эти паттерны, смотрите исправленный код:

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

См. Демонстрация Java онлайн

Здесь "(?:[0-9]|" + r10to99 + "|" + r100to199 + "|" + r200to255 + ")" группирует r10to99, r100to199 и r200to255, так что внутри более крупного шаблона (с использованием группа без захвата) | не разрушит весь шаблон.

Паттерн r0to255 + "(?:[.]" + r0to255 + "){3}" на самом деле является паттерном r0to255, за которым следуют три последовательности: . и паттерн r0to255.

Использование ?: в r0to255 означает разрешить все без изменения моего regexP. Надо при ?: использовать regexIP?

KunLun 26.09.2018 18:10

@ raul1ro Вы правы, но шаблон ababab слишком многословен, нотация (?:ab){3} проще и удобнее в обслуживании. Что ж, решать только вам.

Wiktor Stribiżew 26.09.2018 20:53

Для полноты картины, конечно, у Apache уже есть решение для этого.

Я знаю это, но почему неправильно пытаться реализовать мой собственный метод? Пытаясь найти для этого регулярное выражение, я узнал новое.

KunLun 26.09.2018 18:59

Другие вопросы по теме