Regex для имени пользователя, которое позволяет цифры, буквы и пробелы - PullRequest
3 голосов
/ 31 июля 2010

Я ищу код регулярного выражения, который можно использовать для проверки правильности имени пользователя.

Я бы хотел, чтобы в имени пользователя были буквы (как прописные, так и строчные), цифры, пробелы, подчеркивания, тире и точки, но имя пользователя должно начинаться и заканчиваться буквой или цифрой.

В идеале, он также не должен допускать повторения каких-либо специальных символов, перечисленных выше, более одного раза подряд, то есть они могут иметь столько пробелов / точек / тире / подчеркиваний, сколько они хотят, но должно быть по крайней мере одна цифра или буква между ними.

Мне также интересно узнать, считаете ли вы, что это хорошая система для имени пользователя? Я искал какое-то регулярное выражение, которое могло бы сделать это, но ни один из них, похоже, не допускал пробелов, и я хотел бы, чтобы в именах пользователей было несколько пробелов.

Спасибо:)

Ответы [ 3 ]

7 голосов
/ 31 июля 2010

Похоже, что вы хотите, чтобы ваше имя пользователя содержало часть "word" (последовательность букв или цифр), перемеженную с какой-то частью "separator".

Регулярное выражение будет выглядеть примерно так:

^[a-z0-9]+(?:[ _.-][a-z0-9]+)*$

Вот схематическая разбивка:

           _____sep-word…____
          /                  \
^[a-z0-9]+(?:[ _.-][a-z0-9]+)*$             i.e. "word ( sep word )*"
|\_______/   \____/\_______/  |
| "word"     "sep"   "word"   |
|                             |
from beginning of string...   till the end of string

Итак, по сути, мы хотим сопоставить такие вещи, как word, word-sep-word, word-sep-word-sep-word и т. Д.

  • Не будет последовательных sep без word между
  • Первый и последний символ всегда будут частью word (то есть не sep char)

Обратите внимание, что для [ _.-], - является последним, так что это не метасимвол определения диапазона.(?:…) - это то, что называется группа без захвата .Нам нужны скобки для группировки для повторения (т. Е. (…)*), но так как нам не нужен захват, мы можем использовать (?:…)* вместо.

, чтобы разрешить прописные / различные буквы Unicode и т. Д., Просторазверните класс символов / при необходимости используйте дополнительные флаги.

Ссылки

2 голосов
/ 31 июля 2010

Хотя я уверен, что кто-то в скором времени опубликует регулярное выражение в 1 миллион строк, чтобы сделать именно то, что вы хотите, я не думаю, что в этом случае регулярное выражение является хорошим решением.

Почему бы вам ненаписать старый добрый парсер?Это займет примерно столько же времени, сколько и написание регулярного выражения, которое сделает все, что вы упомянули, но его будет гораздо проще поддерживать и читать.

В частности, это сложная часть:

он также не должен допускать повторения каких-либо специальных символов, перечисленных выше, более одного раза подряд

В качестве альтернативы вы всегда можете сделать гибрид этих двух.Регулярное выражение для других проверок ([a-zA-Z0-9][a-zA-Z0-9 _-\.]*[a-zA-Z0-9]) и метод без регулярного выражения для требования отсутствия повторения.

1 голос
/ 31 июля 2010

Вам не нужно использовать регулярное выражение для всего .Я считаю, что требования типа «нет двух последовательных символов» обычно делают регулярные выражения настолько уродливыми, что этот бит лучше сделать с помощью простого процедурного цикла.

Я бы просто использовал что-то вроде ^[A-Za-z0-9][A-Za-z0-9 \.\-_]*[A-Za-z0-9]$ (илиэквиваленты, такие как ::alnum::, если ваш механизм регулярных выражений более продвинутый), а затем просто проверьте каждый символ в цикле, чтобы убедиться, что следующий символ не совпадает.

Делая это процедурно, вы можете проверить вседругие правила, которые вы, вероятно, захотите в какой-то момент, не прибегая к тому, что я называю «регулярная гимнастика», например:

  • запрещено указывать ваше имя или фамилию.не более двух последовательных цифр.

и пр.

...