2016-02-15 5 views
0

Я сделал это регулярное выражение, чтобы проверить, является ли строка допустимым IP, включая проверку, находится ли каждый октет между 0-255 (точнее, он проверяет, находится ли он между 0-199 ИЛИ 200-249 OR 250 -255)Regex golf - Есть ли более короткий путь?

((1?\d?\d|2[0-4]\d|25[0-5])\.){3}(1?\d?\d|2[0-4]\d|25[0-5])

более простой способ смотреть на него есть:

(pattern\.){3}pattern

, который соответствует pattern.pattern.pattern.pattern SUC ч, что картина представляет собой число от 0 до 255.

мне было интересно, если есть более короткий путь написания этого регулярного выражения, так что pattern только должно быть написано один раз, а не ставя под угрозой точности регулярных выражений, как (pattern\.?){4} делает ,

редактировать

выглядит следующим образом: ^pattern($|\.(?!$)){4}$ делает именно то, что я ищу.

Взято из: https://stackoverflow.com/a/28446132/4526483

+1

ваше регулярное выражение принимает 00, но не 000. Почему? – njzk2

+2

Я не думаю, что я видел, как кто-либо писал IP-адрес с многозначными нулями в любом из восьмиугольников – Knowbody

+0

Не означает, что он недействителен. – miken32

ответ

0

На самом деле да! Начните с немного слишком гибким регулярное выражение, которое имеет сложную структуру раз:

(pattern\.?){4} 

Затем применить утверждение для блокировки точек:

(?=(\d+\.){3}\d+([^.\d]|$))(pattern\.?){4} 

Полное регулярное выражение будет таким:

(?=(\d+\.){3}\d+([^.\d]|$)(1?\d?\d|2[0-4]\d|25[0-5])\.){4} 

Если точка в порядке, чтобы сразу следовать за ip, удалите точку из класса символов в ожидании.

+0

Похоже, это делает его немного короче: '(? = (\\ d + \.) {3} \\ d +) ((1? \ D? \ D | 2 [0-4] \ d | 25 [0-5]) \.?) {4} ' – Knowbody

+0

@knowbody, если вы не суетитесь о том, что следует, вы даже можете полностью удалить финальную часть' ([^. \ D] | $) ' – Bohemian

Смежные вопросы