2011-02-06 3 views
4

У кого-либо есть регулярное выражение для проверки полного доменного имени?Подтвердить полное доменное имя в C#

Теперь я использую на этом регулярное выражение:

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

Однако это регулярное выражение результатов в «aa.a» не является действительным, а «aa.aa» является действительным.

Кто-нибудь знает, почему?

ответ

4

Вот короче картина:

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

А почему шаблон определяет «aa.a» недействительными и «aa.aa» действительным, это из-за {2,} - если вы измените 2 к a 1, так что это

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

оно должно считаться как «aa.a», так и «aa.aa» действительным.

string pattern = @"(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{1,})$)"; 
bool isMatch = Regex.IsMatch("aa.a", pattern); 

isMatch ИСТИНА для меня.

+0

Я делаю это, но это не работает, снова он определяет «aa.a» как недействительный и «aa.aa» как действительный. можете ли вы объяснить мне, что означает «{1,}» вместо «{2,}»? – RRR

+0

Использование шаблона с '{1.}' 'aa.a" проверяет для меня. В фигурных скобках указывается конкретное количество повторений, поэтому '{1,}' требует по крайней мере 1 повторения, а '{2,}' требует не менее 2. – bitxwise

+0

. Дополнительный вопрос: каковы различия между шаблоном, который вы предлагаете мне для шаблона что я использую? – RRR

2

Я думаю, что это также может быть вариант, особенно, если полное доменное имя позже будет использоваться вместе с System.Uri:

var isWellFormed = Uri.CheckHostName(stringToCheck).Equals(UriHostNameType.Dns); 

Обратите внимание, что этот код учитывает частично доменные имена должны быть хорошо сформированные.