Как сделать условие, что если строка заканчивается на цифру, то после нее должна быть точка и 2 символа
Есть regExp, которые матчит домены сайтов.
/^([\wёa-я-\d]{2,}\.)+([\wёa-я-\d]{2,})$/
Как мне определить, что если в конце стоит цифра, то после нее обязательно должна идти точка ну и 2 символа потом?
Допустим есть домен, он валидный
google.com
Но если в конце поставить любую цифру, то будет считаться, что это должен быть домен 3 уровня и ждать точку и после нее 2 символа
google.com5 - не валидный
google.com5.ru - валидный
Ответы (2 шт):
Ну в TLD по идее и не ожидается цифр (по крайней мере, среди ходовых TLD нет с цифрами, на момент написания этого ответа)... поэтому:
/^([\wёa-я-\d]+\.)+([a-zёa-я]{2,})$/i
А вот вариант с более адекватным для имен доменов рег.выражением - оно не матчит имена с _ (разве он допустим?), а также с - в начале или в конце имени поддомена:
const re = /^((?:[a-zёa-я\d]+-)*[a-zёa-я\d]+\.)+([a-zёa-я]{2,})$/i;
inp.addEventListener('input', () => void(rslt.textContent = re.test(inp.value)));
inp.dispatchEvent(new InputEvent('input'));
<input id="inp" value="foo-bar123.baz42.io">
<span id="rslt"></span>
Попутно этим исправлен и квантификатор {2,} в части доменного имени - он некорректен, т.к. имена поддоменов (т.е., все части доменного имена кроме TLD) вполне могут состоять из одного символа.
Помните, что \w - это [A-Za-z0-9_]. Чтобы исключить цифры, используйте [A-Za-z_]. Так как в конце строки требуется два и более символов, {2,} можно заменить на + (один и более), если добавить шаблон с исключёнными цифрами.
^(?:[\wёa-я-]{2,}\.)+[\wёa-я-]+[a-zA-Z_ёa-я-]$
См. пример работы регулярного выражения.
Другой вариант - использование негативного блока просмотра вперёд:
^(?!.*\d$)(?:[\wёa-я-]{2,}\.)+[\wёa-я-]{2,}$
(?!.*\d$) означает, что последний символ не может быть цифрой.