Всем привет.
Задача такая: в input-поле заносим либо IP, либо URL. Нужно их валидировать, для чего я решил воспользоваться регулярными выражениями, вынеся их в отдельный файл, чтобы ими было удобнее управлять.
В файл сейчас записано следующее:
const urlPattern = '^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$';
const ipPattern =
'^(1?\d{1,2}|2[0-4]\d|25[0-5])\.' +
'(1?\d{1,2}|2[0-4]\d|25[0-5])\.' +
'(1?\d{1,2}|2[0-4]\d|25[0-5])\.' +
'(1?\d{1,2}|2[0-4]\d|25[0-5])\/?(\b|\/32)$';
export const urlPatternExp: RegExp = new RegExp(urlPattern);
export const ipPatternExp: RegExp = new RegExp (ipPattern);
export const ipOrUrlPatternExp: RegExp = new RegExp (`(${urlPattern})|(${ipPattern})`, 'g');
(ipPattern расписан так, чтобы линтер не ругался на длину строки.)
Идея в том, чтобы сформировать наборы паттернов, в различных конфигурациях собрать их в регулярные выражения, и использовать во всем приложении.
На
regEx101 (в режиме JS), происходит 2 полных совпадения. Можете сами попробовать:
(^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}$)|(^(1?\d{1,2}|2[0-4]\d|25[0-5])\.(1?\d{1,2}|2[0-4]\d|25[0-5])\.(1?\d{1,2}|2[0-4]\d|25[0-5])\.(1?\d{1,2}|2[0-4]\d|25[0-5])\/?(\b|\/32)$)
В приложении используется Angular. В реактивных формах валидация прописана так:
url: [
'',
[ Validators.required, Validators.pattern(ipOrUrlPatternExp) ]
],
При ручном тестировании формы в приложении,
name.com валидацию проходит, а
192.168.1.1 выдает ошибку.
Буду бесконечно признателен, если подскажете, почему.
UPD.: Решение в комментарии к вопросу.