Регулярное выражение для проверки полного доменного имени в C# и Javascript

Какое правильное регулярное выражение для проверки полного доменного имени в C# и Javascript? Я искал повсюду, и я нашел разные спецификации. Который правильный.

Несколько примеров, которые я нашел:

   1.(?=^.{1,254}$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]{1,63}(?<!-)\.?)+(?:[a-zA-Z]{2,})$)

    2. (?=^.{1,254}$)(^(?:(?!\d|-)[a-zA-Z0-9\-]{1,63}(?<!-)\.?)+(?:[a-zA-Z]{2,})$)

    3. \b((?=[a-z0-9-]{1,63}\.)(xn--)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}\b 

   (Regular Expression cook book)

Пожалуйста помоги


person Shetty    schedule 01.08.2013    source источник
comment
RFC 1035, blog.gnukai.com/2010/06/fqdn-regular-expression   -  person Andreas    schedule 01.08.2013
comment
@Андреас: спасибо. Я видел это. Он говорит: «Единственное отклонение от правил RFC, которое я делаю, — это дополнительное правило, согласно которому домен верхнего уровня (часть, которая следует за последним «.») должен состоять только из символов и должен состоять из 2 или более (.com, .net , .org, .eu, .uk и т. д.). Я не могу найти, где это задокументировано, хотя. Не уверен, что это правильно.   -  person Shetty    schedule 01.08.2013
comment
Из RFC 920 — требования TLD: ARPA, GOV, EDU, COM, MIL, ORG или английский двухбуквенный код страны. Так что это кажется допустимым расширением/модификацией.   -  person Andreas    schedule 01.08.2013
comment
@Anders: Какие изменения я должен внести, чтобы использовать его в Javascript. Я пробовал следующее -› var fqdnRegEx = /(?=^.{1,254}$)(^(?:(?!\d+\.|-)[a-zA-Z0-9_\-]{1,63} (?‹!-)\.?)+(?:[a-zA-Z]{2,})$)/; это дает ошибку.   -  person Shetty    schedule 01.08.2013
comment
@Андреас, размышляя об этом годы спустя, уже чувствует себя древним   -  person Coffeeholic    schedule 20.03.2021


Ответы (1)


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

/^(?=.{1,254}$)((?=[a-z0-9-]{1,63}\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}$/i

Пояснение:

^                      # Start of string
(?=.{1,254}$)          # Assert length of string: 1-254 characters
(                      # Match the following group (domain name segment):
 (?=[a-z0-9-]{1,63}\.) # Assert length of group: 1-63 characters
 (xn--+)?              # Allow punycode notation (at least two dashes)
 [a-z0-9]+             # Match letters/digits
 (-[a-z0-9]+)*         # optionally followed by dash-separated letters/digits
 \.                    # followed by a dot.
)+                     # Repeat this as needed (at least one match is required)
[a-z]{2,63}            # Match the TLD (at least 2 characters)
$                      # End of string
person Tim Pietzcker    schedule 02.08.2013
comment
спасибо за ваш ответ. Это работает. Не могли бы вы сообщить мне, к каким ресурсам я могу обратиться, чтобы найти правила для полного доменного имени, чтобы я мог провести дополнительное тестирование? - person Shetty; 02.08.2013
comment
В комментариях выше есть ссылки на некоторые RFC; эти документы довольно сложны, хотя. Возможно, поможет en.wikipedia.org/wiki/Hostname#Restrictions_on_valid_host_names? - person Tim Pietzcker; 02.08.2013
comment
xn----dtbjjdcfhg5cckn1k9a.xn--p1ai Попробуйте ... и получите "false". - person diproart; 24.06.2014
comment
@tim Дефисы должны быть разрешены после начального xn--. Цифры могут быть разрешены в TLD, если TLD является punycode. Как говорит пользователь выше, xn----dtbjjdcfhg5cckn1k9a.xn--p1ai настоящее имя хоста. - person mikemaccana; 27.02.2015