Как вы делаете эту условную ситуацию с регулярным выражением? - PullRequest
6 голосов
/ 27 июня 2011
  1. Начинается с буквенно-цифрового ^[a-z0-9]
  2. Затем следует эта необязательная точка \.?
  3. Если есть точка, за ней ДОЛЖНЫ следовать от 2 до 4 алфавитов [a-z]{2,4}
  4. Он должен заканчиваться алфавитом [a-z]$
  5. Это должна быть точка и максимум две точки.

это как доменные имена:

yahoo.co.uk или yahoo.com, но вы не можете сделать это yahoo.co.u или это yahoo.co., да что-то в этом роде.

Ответы [ 4 ]

7 голосов
/ 27 июня 2011

Вы можете сгруппировать дополнительную точку с 2-4 символами, которые должны следовать за ней: (\.[a-z]{2,4}).Тем не менее, у вас не будет ни одной, или не более двух из этих групп точек + буквенных символов (\.[a-z]{2,4}){0,2}.

Обязательное заканчивается на [a-z] часть, которую вы можете проверить с положительным взглядом за (?<=[a-z])задавая это как полное регулярное выражение:

^[a-z0-9]+(\.[a-z]{2,4}){0,2}(?<=[a-z])$

Это будет работать в регулярных выражениях Perl и PHP (PCRE), но не в JavaScript, потому что оно не поддерживает просмотр назад.В этом конкретном случае вы можете обойти это ограничение.

Если есть хотя бы одна точка, уже есть гарантия, что она закончится [a-z], потому что этот тест находится в группе, в которой находится точкачасть.Если точки нет, вам нужно ввести [a-z] в конце.Для этого вы можете превратить один или несколько квантификаторов (+) в ноль или более (*) и заставить конец равным [a-z], когда нет «групп точек».Когда есть группы точек, вы можете сохранить тот же шаблон, но теперь с хотя бы одной обязательной точкой.

^([a-z0-9]*[a-z]|[a-z0-9](+\.[a-z]{2,4}){1,2})$
5 голосов
/ 27 июня 2011

Проверяет строку, которая начинается с [a-z][0-9], а затем содержит одну или две точки, за которыми следуют 2/4 алфавита. Он работает (по крайней мере, в Python) для предоставленных вами примеров (true для yahoo.co.uk и yahoo.com, false для yahoo.co.u и yahoo.co.)

^[a-z0-9]+(\.[a-z]{2,4}){1,2}$

Изменить - после перечитывания, я думаю, вы можете захотеть это:

^[a-z0-9]*([a-z0-9](\.[a-z]{2,4}){1,2}$|[a-z]$)

Это будет соответствовать строкам (в дополнение к вышеупомянутым), которые не содержат точек, но заканчиваются буквой, такой как yahoo, но не yahoo2.

0 голосов
/ 27 июня 2011
^[a-z0-9](?=[^.]*\.[^.]+$|[^.]*\.[^.]\.[^.]+$)(\.(?=[a-z][a-z]){1,2}).*[a-z]$
0 голосов
/ 27 июня 2011

Попробуйте это:

^[a-z0-9](\.[a-z]{2,4}|.*[a-z]$)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...