Как сделать условие, что если строка заканчивается на цифру, то после нее должна быть точка и 2 символа

Есть regExp, которые матчит домены сайтов.

/^([\wёa-я-\d]{2,}\.)+([\wёa-я-\d]{2,})$/

Как мне определить, что если в конце стоит цифра, то после нее обязательно должна идти точка ну и 2 символа потом?

Допустим есть домен, он валидный

google.com

Но если в конце поставить любую цифру, то будет считаться, что это должен быть домен 3 уровня и ждать точку и после нее 2 символа

google.com5 - не валидный

google.com5.ru - валидный

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

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

Ну в 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) вполне могут состоять из одного символа.

→ Ссылка
Автор решения: Wiktor Stribiżew

Помните, что \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$) означает, что последний символ не может быть цифрой.

→ Ссылка