Я пытаюсь создать выражение регулярного выражения, которое соответствует чему-то, что не отформатировано как: ip|port.
Значение порта может быть между [1, 65535].
Примеры набора данных:
(1) 8.8.8.8|0 (плохо: порт 0 не разрешен)
(2) 8.8.8.8|1 (хорошо)
( 3) 8.8.8.8|65536 (плохо: порт > 65535)
(4) 8.8.8.8|dawda (плохо: char)
Выражение регулярного выражения (соответствие неверным данным) должно соответствовать (1), (3) и (4).
Учтите, что часть ip всегда будет правильной (нет необходимости в регулярном выражении), и что мне нужно проверить, так это порт. Из-за этого я начал оценку с конца строки следующим образом:
Регулярное выражение для соответствия порту от 0 до 65535:
\|(6553[0-5]|655[0-2]\d|65[0-4]\d{2} |6[0-4]\d{3}|[1-5]\d{4}|[1-9]\d{0,3})
Регулярное выражение с совпадением конца строки:
\ |(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d{ 4}|[1-9]\d{0,3})$
Теперь я хочу отменить это, чтобы поймать строку, которая не заканчивается действительным портом. Я смотрю на другие форумы (Как отменить конкретное слово в регулярном выражении? , Регулярные выражения и отрицание целой группы символов) и изучите об отрицательном упреждающем регулярном выражении.
Согласно этим форумам и отрицательному регулярному выражению, мое регулярное выражение должно быть таким:
^(?!(MY_REGEX)).*$
Я изменил свое регулярное выражение и добавил .* для части ip, чтобы подключить ^.
Отрицательное регулярное выражение в конце строки:
^(?!. \|(6553[0-5]|655[0-2]\d|65[0-4]\d{2}|6[0-4]\d{3}|[1-5]\d {4}|[1-9]\d{0,3})).$
У меня проблема с конечной частью .*$, которая разрешает что-то после номера порта. В конце концов, этот код будет выполняться с помощью PHP. В соответствии с PHP, ретроспективное выражение переменной длины не поддерживается, что заставляет меня в первую очередь выбирать регулярное выражение с опережением.
Спасибо за помощь.
|
. Затем в вашем коде используйте метод для проверки диапазона чисел. Regex не очень хорошо справляется с математикой. - person CAustin   schedule 04.08.2017