Регулярные выражения javaScript валидация ip адреса Regexp

Всем здравствуйте, нужен универсальный совет как реализовать регулярное выражение,или пример с кодом, желательно подробный (если такой у вас имеется в закромах) .

Нужно проверить строку на введённый ip адрес, функцию проверки я написал, а вот с регулярными выражениями для проверки есть сложности.

мне нужно написать 1 общую регулярку которая даст мне возможность, проверять след условия:

  1. Возможно ввести ip адрес и порт через “:”
  2. Можно ввести доменное имя и порт через “:”
  3. Проверка на корректность ввода данных (порт), а именно наличие знака “:” и тип данных после знака “:” будет число
  4. Валидацию домена не проводить
  5. Пример заполнения поля

a. 10.10.50.140:5900
b. doc1.test.com.ua:5900
c. https://233-1172-0.test-t.da.com:443
d.llanfairpwllgwyngyllrychwyrndrobwllllatysiliogogogoch.co.da:443

Сам пробовал разобраться проверяю свои регулярки тут , получается по отдельности проверить
домен (\w+[./])*,
порт (\w+:\d{0,5}\/)?
или вот такой универсальный способ /\d+\.\d+\.\d+\.\d+:\d+/ но здесь только цифры и порт.

Я же хочу чтоб все 4 случая проходили по регулярке. Всем удачи с кодом!


Ответы (2 шт):

Автор решения: EzioMercer

Придумал такую штуку. Я не уверен, что это правильное решение, но на простых тестах прошла проверку

Основная логика в том, что я стал ориентироваться на кол-во точек в строке. И если сильно обощить то я смотрю на выражение такого вида:

(что угодно)(точка) 3 раза (что угодно) и быть может есть (двоеточие)(любое число) и всё это не учитвая регистр символов

Просто этот что-угодно немного разнится в разных местах:

  1. По середине - это числа, буквы, минус и деление
  2. В начале - это всё что в середине и двоеточие
  3. В конце - это тоже самое что и в середине только нет точки в конце

Код:

const ips =  [
  '10.10.50.140:5900',
  'doc1.test.com.ua:5900',
  'https://233-1172-0.test-t.da.com:443',
  'd.llanfairpwllgwyngyllrychwyrndrobwllllatysiliogogogoch.co.da:443',
  '10.10.50:5900',
  'doc1.test.com.ua:59sd00',
  'https://233-1172-0.tes.com:443',
  'llanfairpwllgwyngyllrychwyrndrobwllllatysiliogogogoch.co.da:443'
];

const regexp = /^(([a-z]|\d|-|\/|:)+\.){1}(([a-z]|\d|-|\/)+\.){2}([a-z]|\d|-|\/)+(:\d+)?$/i;

for (const ip of ips) {
  console.log(ip, regexp.test(ip));
}

→ Ссылка
Автор решения: another_login

Если упаковывать все условия в одну регулярку (не знаю насколько оправдано), у меня получилось так (первый без валидации домена, второй с минимальной валидацией):

const test_data = ['example.com', 'example.com:8080', 'test.com', '233-1172-0.nodered-t.it.loc:443', '10.10.50.140:5900', '10.10.50.140', '10.10.50.1400', '10.10.5.140', '10f.10.50.140', 'https://10.10.50.140:5900', 'https://10.10.50.140', 'https://test.com', 'https://example.com:8080', '-test.com', 'te-st.com', 'test-.com', 'https://test-.com', 'https://-test.com', 'https://te-st.com', '10.10.50.140:5900', 'doc1.test.com.ua:5900', 'https://233-1172-0.test-t.da.com:443', 'd.llanfairpwllgwyngyllrychwyrndrobwllllatysiliogogogoch.co.da:443', '10.10.50:5900', 'doc1.test.com.ua:59sd00', 'https://233-1172-0.tes.com:443', 'llanfairpwllgwyngyllrychwyrndrobwllllatysiliogogogoch.co.da:443'];

const regexp_no_domain_validation = /^(https?:\/\/)?((([a-z0-9-]+\.)+([a-z]{2,}))|((\d{1,3}\.){3}\d{1,3}))(:\d{1,5})?$/i;
const regexp_with_domain_validation = /^(https?:\/\/)?((((?!-)([a-z0-9-]{1,63})(?<!-)\.)+([a-z]{2,}))|((\d{1,3}\.){3}\d{1,3}))(:\d{1,5})?$/i;


for (const t of test_data) {
  console.log(t, ' --- ', regexp_no_domain_validation.test(t), ' --- ', regexp_with_domain_validation.test(t));
}

→ Ссылка