2015-02-08 4 views
5

Я пытаюсь создать regex для проверки имен пользователей, которые должны соответствовать следующим:Regex чтобы соответствовать имя пользователя

  • только один специальный символ (._-) разрешено, и это не должно быть на extremas струны
  • первый символ не может быть числом
  • Все остальные символы разрешены буквы и цифры
  • общая длина должна составлять от 3 до 20 символов

Это шаблон шаблона HTML5, поэтому, к сожалению, это должно быть одно большое регулярное выражение.

До сих пор это то, что у меня есть:

^(?=(?![0-9])[A-Za-z0-9]+[._-]?[A-Za-z0-9]+).{3,20} 

Но положительный предпросмотр может повторяться более чем один раз, что позволяет быть более чем один специальный символ, который не то, что я хотел. И я не знаю, как это исправить.

+0

Не ответ еще - но вам нужно разбить '.' в' [._-] '. – amit

+0

Для чего-то такого сложного, почему вы выбираете шаблон шаблона html? Вы можете вызвать событие, которое обрабатывает проверку, а не шаблон. – Eclecticist

+0

@amit [._-] - единственный символ в списке «._-» буквально, поэтому точка не считается символом, поэтому я думаю, что мне не нужно ее разбивать. – Tofandel

ответ

14

Вы должны разделить ваши регулярные выражения на две части, чтобы сделать вашу жить проще (не два выражения!):

Во-первых, соответствовать формату имя пользователя, необходимо иметь: ^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$

Теперь нам просто нужно проверить ограничение длины. Для того, чтобы не возиться Arround с уже найденной моделью, вы можете использовать не всепоглощающий матч, который только проверяет количество символов (его litterally хак для создания и шаблона для регулярного выражения): (?=^.{3,20}$)

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

так, все вместе:

(?=^.{3,20}$)^[a-zA-Z][a-zA-Z0-9]*[._-]?[a-zA-Z0-9]+$ 

Regular expression visualization

Debuggex Demo

+1

Спасибо мастеру регулярного выражения, это работает (мне просто пришлось заменить последний * на +, поэтому специальный символ не может быть в конце – Tofandel

+1

@ Adri1du40 также отметил это. (И уже исправил его) – dognose

0

Я думаю, вам нужно использовать ? вместо +, поэтому специальный символ будет соответствовать только один раз или нет.

^(?=(?![0-9])?[A-Za-z0-9]?[._-]?[A-Za-z0-9]+).{3,20}

+0

Это позволило бы использовать только специальный символ чтобы быть в начале строки – Tofandel

+0

@ Adri1du40 Вы уверены? Я думаю, что '?' В основном '+', за исключением того, что оно соответствует только нулевому времени или одному. –

+0

Да, это что?? но если вы дадите персонажу нулевое время перед специальным символом, тогда в начале будет специальный символ. – Tofandel