2015-07-16 5 views
1

Макс. Длина строки 5 (включая один алфавит). Если нет алфавита, допустимая длина цифр 4.Требуется регулярное выражение, допускающее только 4 цифры и один алфавит

цифры позволили: 0 к 9999

Один алфавит допускается (только если строка имеет по крайней мере один номер). Некоторые примеры:

  • Разрешенные: 1a, a2, 1111a, 1a22, 9999

  • Не допускается: 99999, 11111, a, aa

Я пробовал:

 ^(?:[0-9]|[a-z](?=[^a-z]*$)){1,5}$ 

Это работает для случаев: 1a, a2, 1111a, 1a22, 9999. Но это неправильно позволяет также 99999. Любая помощь в том, как ограничить длину цифры?

ответ

1
^(?:(?=\d*[a-z]\d*$)(?=.*[0-9])(?:[a-z0-9]){1,5}|[0-9]{1,4})$ 

Попробуйте this.See демо.

https://regex101.com/r/fX3oF6/10

+0

Не допускается использование только одного алфавита и только алфавита. Разрешены только номера или включая алфавит. ** Разрешено: 12,123a, a1 ** | ** Не разрешено: a, aa, 12345 ** – knix2

+0

Это позволяет 8aa, a8aa. Более одного алфавита не допускается. – knix2

+0

@ knix2 сейчас проверьте – vks

0

Использовать {size} для ограничения длины строки в регулярном выражении.

Я обновить регулярное выражение:

^(?:(?=.*[a-z])(?:[0-9]|[a-z]){1,5}|[0-9]{4})$ 
+0

Что случилось с '(?: [0-9] | [a-z])'? Почему не '[0-9a-z]'? – nhahtdh

+0

@codeaholicguy Более одного алфавита и только алфавита не допускается.Разрешены только номера или включая алфавит. ** Разрешено: 12,123a, a1,9999 ** | ** Не разрешено: a, aa, 12345 ** – knix2

1

Регулярные выражения не очень хорошо держать подсчет вещей, как вы обнаружили. В этом случае опережения поставит вас прямо:

^\d{1,4}$|^(?=\d*[a-z]\d*$)[a-z\d]{1,5}$ 

Мы начинаем с помощью ^\d{1,4}$, чтобы получить простейший случай из пути первого. Если это не удастся, вторая альтернатива, вторая альтернатива берет на себя. Первое, что он делает, это использовать (?=\d*[a-z]\d*$), чтобы утверждать, что в строке есть ровно одна буква. Если результат выглядит успешно, позиция совпадения возвращается к началу строки, что позволяет нам снова совместить целую строку, на этот раз с [a-z\d]{1,5}$.

На самом деле нет необходимости проверять, что остальные символы являются цифрами в этой точке. Вместо этого я мог бы использовать (?=[^a-z]*[a-z][a-z]*$. Нам просто нужно убедиться, что он смотрит на всю строку. Я просто думаю, что это более самодокументируется с \d*.

Обратите внимание, что это регулярное выражение будет соответствовать строке, состоящей только из буквы. Если вы хотите убедиться, что есть хотя бы одна цифра, измените окончательный {1,5} на {2,5}.

Вот demo.

+0

Спасибо Алан. Разъяснилось красиво. Я был смущен использованием **?: ** и **? = ** – knix2

Смежные вопросы