Здесь мы начнем с выражения, которое ограничено справа символом .com
или .co.uk
и другими, если необходимо, затем проведем пальцем влево, чтобы собрать все не точечные символы, добавив необязательный www
и https
, тогда мы добавим начальный символ ^
, который не сможет работать со всеми поддоменами:
^(https?:\/\/)?(www\.)?([^.]+)(\.com|\.co\.uk)(.+|)$
Другие TLD могут быть добавлены в эту группу захвата:
(\.com|\.co\.uk|\.net|\.org|\.business|\.edu|\.careers|\.coffee|\.college)
И выражение можно изменить на:
^(https?:\/\/)?(www\.)?([^.]+)(\.com|\.co\.uk|\.net|\.org|\.business|\.edu|\.careers|\.coffee|\.college)(.+|)$
Гибкость
Я не могу придумать, что сделать TLD слишком гибкими, так как это выражение проверки,Например, если бы мы упростили его до:
^(https?:\/\/)?(www\.)?([^.]+)(\.[a-z]+)(\.uk?)?[a-z?=\/]+$
, он мог бы работать для URL-адресов, перечисленных в вопросе, но он также передал бы:
example.example
, что недопустимо.Мы можем использовать только это выражение:
^(https?:\/\/)?(www\.)?([^.]+)(\.[a-z]+)(\.uk?)?[a-z?=\/]+$
, если мы знаем, что то, что мы передаем, это уже URL.
Демо
Этот фрагмент показывает, как работают группы захвата:
const regex = /^(https?:\/\/)?(www\.)?([^.]+)(\.com|\.co\.uk)(.+|)$/gm;
const str = `example.com
www.example.com
example.co.uk
example.com/page
example.com?key=value
test.example.com
sub.test.example.com`;
let m;
while ((m = regex.exec(str)) !== null) {
// This is necessary to avoid infinite loops with zero-width matches
if (m.index === regex.lastIndex) {
regex.lastIndex++;
}
// The result can be accessed through the `m`-variable.
m.forEach((match, groupIndex) => {
console.log(`Found match, group ${groupIndex}: ${match}`);
});
}
RegEx Circuit
jex.im визуализирует регулярные выражения:
RegEx
Если это выражение нежелательно, его можно изменить / изменить в regex101.com .