2014-09-10 5 views
1

У меня плохое регулярное выражение. Просто плохо. Я думал, что я порядочный, но нет. Я просто плохой.Квантор не работает

Как это сделать из моей груди, как мы можем сделать квантификатор {1,61} для всей предыдущей группы?

^((xn-|[a-zA-Z0-9]+)((-[a-zA-Z0-9]+)+)?){1,61}(\.[a-zA-Z]{2,})?$ 

Вот RegExr.

Это шаблон имени домена, кстати.

+2

Что вы пытаетесь найти? Например, что пример того, что * должен * соответствовать (и почему), и что-то, что не должно (и почему)? Ваш '{1,61}' определитель находится на шаблоне, который не может ничего сопоставить, я могу наблюдать. – Pointy

+0

Посмотрите, что вам говорит RegExr: ваша первая группа соответствует всему. Он говорит: «Сопоставьте либо строку« xn- », либо любую последовательность из одного или нескольких буквенно-цифровых символов». Вот и вся строка поиска. – Pointy

+0

@Pointy Ну, домен может выглядеть так: «aaa» или «aaa-aaa» или «xn-aaa». И это должно быть не более 61 символа. – Birowsky

ответ

2

Ваше выражение не работает, потому что {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,})?$ 
Смежные вопросы