Regex для соответствия Domain.CCTLD - PullRequest
8 голосов
/ 08 июля 2010

Кто-нибудь знает регулярное выражение для соответствия Domain.CCTLD?Я не хочу поддоменов, только «атомный домен».Например, docs.google.com не сопоставляется, а google.com.Однако это усложняется такими вещами, как .co.uk, CCTLD.Кто-нибудь знает решение?Заранее спасибо.

РЕДАКТИРОВАТЬ: Я понял, что мне также приходится иметь дело с несколькими поддоменами, например john.doe.google.co.uk.Нужно решение сейчас как никогда: P.

Ответы [ 4 ]

8 голосов
/ 08 июля 2010

Похоже, вы ищете информацию, доступную в проекте Public Suffix List .

«Открытый суффикс» - это тот, под которым пользователи Интернета могут напрямую регистрировать имена. Некоторыми примерами общедоступных суффиксов являются ".com", ".co.uk" и "pvt.k12.wy.us". Public Suffix List - это список всех известных общедоступных суффиксов.

Нет ни одного регулярного выражения, которое бы разумно совпадало со списком открытых суффиксов. Вам нужно будет реализовать код для использования списка общедоступных суффиксов или найти существующую библиотеку, которая уже делает это.

3 голосов
/ 09 июля 2010

Исходя из вашего комментария выше, я собираюсь переосмыслить вопрос - вместо создания регулярного выражения, которое будет соответствовать им, мы создадим функцию, которая будет соответствовать им, и применим эту функцию для фильтрации списка доменаимена включают только домены первого класса, например, google.com, amazon.co.uk.

Сначала нам понадобится список TLD.Как упоминал Грег, общедоступный список суффиксов - отличное место для начала.Предположим, вы проанализировали список в массиве python с именем suffixes.Если вам это неудобно, прокомментируйте, и я могу добавить код, который сделает это.

suffixes = parse_suffix_list("suffix_list.txt")

Теперь нам понадобится код, который определяет, соответствует ли данное доменное имя шаблону some-name.suffix:

def is_domain(d):
    for suffix in suffixes:
        if d.endswith(suffix):
            # Get the base domain name without suffix
            base_name = d[0:-(suffix.length + 1)]
            # If it contains '.', it's a subdomain. 
            if not base_name.contains('.'):
                return true
    # If we get here, no matches were found
    return false
2 голосов
/ 08 июля 2010

Я бы, вероятно, решил эту проблему, получив полный список TLD и используя его для создания регулярного выражения.Например (в Ruby, извините, пока нет Pythonista):

tld_alternation = ['\.com','\.co\.uk','\.eu','\.org',...].join('|')
regex = /^[a-z0-9]([a-z0-9\-]*[a-z0-9])?(#{tld_alternation})$/i

Я не думаю, что можно правильно провести различие между реальными TLD из двух частей и поддоменом, не зная фактического списка TLD (то есть: вы всегда можете создать поддомен, который выглядит как TLD, если бы вы знали, как работает регулярное выражение.)

0 голосов
/ 08 июля 2010
^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$
...