Я могу улучшить эту проверку regex на допустимые доменные имена?

Вы могли бы сделать Integer.of(1).equals(foo), но это немного глупо. Зачем сохранять одну строку? Я бы просто поместил его в одну и ту же цепочку if/else-if (и если это станет длинным, рассмотрим switch/case (что также не является нулевым).

if (foo == null)
else if (foo == 1)
else if (foo == 2)

Также обратите внимание, что сравнение объекты с == немного сложнее из-за того, как автобокс работает (или не работает). Я думаю , что это работает в этом случае, но я не хочу думать об этом тоже сложно, поэтому в моем коде я обычно опускаюсь до int (после нулевой проверки), чтобы быть в безопасности.

6
задан Alnitak 30 December 2008 в 21:42
поделиться

6 ответов

не используйте фиксированный и ужасно сложный regex как это для соответствия для известных доменных имен.

Список TLDs не статичен, особенно с рассмотрением ICANN оптимизированного процесса для нового gTLDs. Даже список ccTLDs иногда изменяется!

Взгляните на список, доступный из http://publicsuffix.org/, и напишите некоторый код, это может загрузить и проанализировать тот список вместо этого.

28
ответ дан 8 December 2019 в 03:28
поделиться

Можно создать regex как строку и затем сделать Regexp.new (строка).

-1
ответ дан 8 December 2019 в 03:28
поделиться

Хорошо, поскольку у Вас есть он записанный, часть TLD эквивалентна, но длиннее, чем (\.<tldpart>){1,2} но я уверен, что это могло быть зафиксировано для дублирования...

править: yech, нет, это было бы возможно, но по существу очень медленный список грубой силы для обработки дублирований я думаю. Более простой и быстрее, чтобы поместить возможный TLD и пар SLD+country в большом hashmap и проверить подстроку по этому.

-1
ответ дан 8 December 2019 в 03:28
поделиться

Я рекомендовал бы запуститься с правил, размеченных в RFC 1035 и затем работать назад - но только если действительно действительно действительно необходимо сделать это с нуля. Домен regex шаблон должен быть (спорная секунда только на адрес электронной почты regex шаблоны) наиболее распространенной вещью там. Я проверил бы сайт regexlib.com и просмотрел бы то, что сделали другие люди.

-1
ответ дан 8 December 2019 в 03:28
поделиться

Загрузите это: http://data.iana.org/TLD/tlds-alpha-by-domain.txt

Использование в качестве примера (в Python):

import re
def validate(domain):
    valid_domains = [ line.upper().replace('.', '\.').strip() 
                      for line in open('domains.txt') 
                      if line[0] != '#' ]
    r = re.compile(r'^[A-Z0-9\-]{2,63}\.(%s)$' % ('|'.join(valid_domains),))
    return True if r.match(domain.upper()) else False


print validate('stackoverflow.com')
print validate('omnom.nom')

Можно учесть доменное здание списка из проверить функции для помощи производительности.

4
ответ дан 8 December 2019 в 03:28
поделиться

Я не знаю достаточно о доменных именах, вероятно. Но почему похож на домены подобранный "foo.info.com"? Кажется, что доменным именем является "info.com" в том особом случае.

И Вы могли бы хотеть удостовериться, что имя запускается с [a-z\d]. Я не думаю, что можно зарегистрировать домен, который запускается с тире?

0
ответ дан 8 December 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: