Вот более короткий шаблон:
(?=^.{1,254}$)(^(?:(?!\d+\.)[a-zA-Z0-9_\-]{1,63}\.?)+(?:[a-zA-Z]{2,})$)
Что касается того, почему шаблон определяет «aa.a» как недействительный, а «aa.aa» как действительный, это из-за {2,}
- если вы измените 2 на 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
это правда для меня.