RegEx за отказ поддоменов - PullRequest
0 голосов
/ 30 мая 2019

По сути, я хотел бы проверить действительный URL, на котором нет поддоменов.Я не могу найти правильное регулярное выражение для него.

Пример URL-адресов, которые ДОЛЖНЫ соответствовать:

  • example.com
  • www.example.com
  • example.co.uk
  • example.com / page
  • example.com? Key = value

Пример URL-адресов, которые НЕ ДОЛЖНЫсовпадение:

  • test.example.com
  • sub.test.example.com

1 Ответ

0 голосов
/ 30 мая 2019

Здесь мы начнем с выражения, которое ограничено справа символом .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 визуализирует регулярные выражения:

enter image description here

RegEx

Если это выражение нежелательно, его можно изменить / изменить в regex101.com .

DEMO

...