Regex — не соответствует концу строки для IOC IP | PORT

Я пытаюсь создать выражение регулярного выражения, которое соответствует чему-то, что не отформатировано как: 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 | дауда (плохо: символ)

Выражение регулярного выражения (соответствует неверным данным) должно соответствовать (1), (3) и (4).

Учтите, что ip часть всегда будет права (нет необходимости в регулярном выражении), и мне нужно проверить порт. Из-за этого я начал оценку к концу строки следующим образом:

Regex для соответствия порта от 0 до 65535:
\ | (6553 [0-5] | 655 [0-2] \ д | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ д {4} | [1-9] \ d {0,3})

Регулярное выражение с соответствием конца строки:
\ | (6553 [0-5] | 655 [0-2] \ д | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ д {4} | [1-9] \ d {0,3}) $

Теперь я хочу отрицать это, чтобы поймать строку, у которой нет действительного порта. Я смотрю на других форумах (Как отрицать конкретное слово в регулярных выражениях?, Регулярные выражения и отрицание всей группы символов) и узнайте об отрицательном предвкушении регулярных выражений.

Согласно этим форумам и отрицательному регулярному выражению, мое выражение должно быть следующим:

^ (?! (MY_REGEX)). * $

Я изменил свое регулярное выражение и добавил. * Для части ip, чтобы подключить ^.

Отрицательное регулярное выражение в конце строки:
^ (?!.\ | (6553 [0-5] | 655 [0-2] \ д | 65 [0-4] \ d {2} | 6 [0-4] \ d {3} | [1-5] \ д {4} | [1-9] \ d {0,3})).$

У меня проблема с конечной частью. * $, Которая разрешает что-то после номера порта. В конце этот код будет выполнен с PHP. В соответствии с PHP, просмотр переменной длины не поддерживается, поэтому я в первую очередь выбираю регулярное выражение.

Спасибо за помощь.

1

Решение

Наиболее подходящим способом является захват детали после | с (.*) (любые 0+ символов кроме символов разрыва строки) и проверка его с помощью небольшого количества кода PHP:

if (preg_match('~^\d+(?:\.\d+){3}\|(.*)$~', $s, $res)) {
if (ctype_digit($res[1]) && intval($res[1]) > 0 && intval($res[1]) < 65536 ) { // valid port, omit
echo "The port is valid: " . $res[1];
} else {
echo "Invalid port: " . $res[1];
}
}

ctype_digit проверяет, содержит ли строка только цифры.

Увидеть онлайн PHP демо.

Если вам просто нужен шаблон, который будет совместим с PCRE, вы можете использовать следующий шаблон:

^\d+(?:\.\d+){3}\|(?!(?:[1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$)(.*)$

Увидеть regex demo

Смотрите подробности ниже:

  • ^ — начало строки
  • \d+ — 1+ цифр
  • (?:\.\d+){3} — 3 последовательности . с последующими цифрами 1+ (шаблон IP, который не нуждается в проверке, считается предварительно проверенным)
  • \| — буквальный |
  • (?!(?:[1-9]\d{0,3}|[1-5]\d{4}|6[0-4]\d{3}|65[0-4]\d{2}|655[0-2]\d|6553[0-5])$) — отрицательный прогноз, который не даст совпадения, если найдет следующие числовые значения в конце строки:
    • [1-9]\d{0,3} — цифра от 1 в 9 а затем от 0 до 3 цифр (1 в 9999)
    • [1-5]\d{4} — цифра от 1 в 5 а потом 4 цифры (10000 в 59999)
    • 6[0-4]\d{3}6цифра из 0 в 4 а потом 3 цифры (60000 в 64999)
    • 65[0-4]\d{2}65цифра из 0 в 4и 2 цифры (65000 в 65499)
    • 655[0-2]\d655цифра из 0 в 2и 1 цифра (65500 в 65529)
    • 6553[0-5]65530 в 65535,
  • (.*) — захватить часть, которая не является допустимым портом, любые 0+ символов (кроме символов разрыва строки) до конца строки
  • $ конец строки.
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]