Ваше выражение не работает, потому что {1-61}
относится к предыдущей группе, которая сама состоит из 1 или более символов.
Вот ответ, используя положительный предпросмотр, как прокомментировал @Casimir:
^(?=.{1,61}$)((xn-|[a-zA-Z0-9]+)((-[a-zA-Z0-9]+)+)?)(\.[a-zA-Z]{2,})?$
Заметим, что если вы пытаетесь соответствовать доменные имена, вы действительно должны быть соответствующие a max of 63 characters в имени, не включая точку -tld. Вышеприведенное выражение будет соответствовать максимальному числу 0 всего, включая dot-tld, поэтому оно будет отклонять действительные имена. Возможно, это ближе к тому, что вы хотите:
^(?=[^\.]{1,63}\.)(xn-|[a-zA-Z0-9]+)((-[a-zA-Z0-9]+)+)?(\.[a-zA-Z]{2,})?$
Что вы пытаетесь найти? Например, что пример того, что * должен * соответствовать (и почему), и что-то, что не должно (и почему)? Ваш '{1,61}' определитель находится на шаблоне, который не может ничего сопоставить, я могу наблюдать. – Pointy
Посмотрите, что вам говорит RegExr: ваша первая группа соответствует всему. Он говорит: «Сопоставьте либо строку« xn- », либо любую последовательность из одного или нескольких буквенно-цифровых символов». Вот и вся строка поиска. – Pointy
@Pointy Ну, домен может выглядеть так: «aaa» или «aaa-aaa» или «xn-aaa». И это должно быть не более 61 символа. – Birowsky