Регулярные выражения javaScript валидация ip адреса Regexp
Всем здравствуйте, нужен универсальный совет как реализовать регулярное выражение,или пример с кодом, желательно подробный (если такой у вас имеется в закромах) .
Нужно проверить строку на введённый ip адрес, функцию проверки я написал, а вот с регулярными выражениями для проверки есть сложности.
мне нужно написать 1 общую регулярку которая даст мне возможность, проверять след условия:
- Возможно ввести ip адрес и порт через “:”
- Можно ввести доменное имя и порт через “:”
- Проверка на корректность ввода данных (порт), а именно наличие знака “:” и тип данных после знака “:” будет число
- Валидацию домена не проводить
- Пример заполнения поля
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 шт):
Придумал такую штуку. Я не уверен, что это правильное решение, но на простых тестах прошла проверку
Основная логика в том, что я стал ориентироваться на кол-во точек в строке. И если сильно обощить то я смотрю на выражение такого вида:
(что угодно)(точка) 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));
}
Если упаковывать все условия в одну регулярку (не знаю насколько оправдано), у меня получилось так (первый без валидации домена, второй с минимальной валидацией):
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));
}