Что такое регулярное выражение для Twitter-подобных имен? - PullRequest
8 голосов
/ 16 мая 2011

Я некоторое время программировал, но до недавнего времени мне не требовалось регулярных выражений.Мне нужно сделать регулярное выражение, которое принимает имена пользователей, как Twitter.По сути, я хочу, чтобы одно подчеркивание за раз.В имени может быть несколько подчеркиваний, но они не должны быть последовательными символами.Также допускаются буквенно-цифровые символы.Но цифры не могут начинать имя.

Такие имена, как

  • _myname67
  • myname67
  • my_name
  • _my_67_name_

действительны, но

  • 94 мое имя
  • __ myname
  • my__name
  • мое имя

не действительны.

Я играл с Rubular и придумал пару регулярных выражений:

  • /^[^0-9\s+](_?[a-z0-9]+_?)+$/i
  • /^([a-z_?])+$/i

Проблема, с которой я продолжаю сталкиваться, состоит в том, что они совпадают более чем с одним подчеркиванием.

Ответы [ 6 ]

10 голосов
/ 16 мая 2011

Отредактировано

a = %w[
    _myname67
    myname67
    my_name
    _my_67_name_
    94myname
    __myname
    my__name
    my\ name
    m_yname
]

p a.select{|name| name =~ /\A_?[a-z]_?(?:[a-z0-9]_?)*\z/i}
# => ["_myname67", "myname67", "my_name", "_my_67_name_", "m_yname"]

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

2 голосов
/ 16 мая 2011

Попробуйте следующее ^([a-zA-Z](_?[a-zA-Z0-9]+)*_?|_([a-zA-Z0-9]+_?)*)$

Я выделил два случая: слово начинается с буквы и начинается с подчеркивания.Если вы не хотите, чтобы имена, состоящие только из одного символа, заменили * на +.

решение maerics имеет одну проблему, оно не захватывает имена с _ на второмместо, например m_yname

1 голос
/ 16 мая 2011

Это похоже на работу:

/^(_|([a-z]_)|[a-z])([a-z0-9]+_?)*$/i

Обновления : исправлено ограничение чисел и регистр.

1 голос
/ 16 мая 2011

Некоторые вещи действительно трудно выразить, используя только регулярные выражения, и, как правило, только для записи (то есть, в последнее время нет возможности читать и понимать их). Вы можете использовать более простое регулярное выражение (например, два, которые вам удалось написать) и проверить наличие двойного подчеркивания в вашем коде Ruby. Это не больно:

if username =~ /^[^0-9](_?[a-z0-9]+_?)+$/i and username.count('__') == 0 then ...

0 голосов
/ 16 мая 2011
/^[A-Za-z_]([A-Za-z0-9]+_?)+$/
0 голосов
/ 16 мая 2011

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

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

В дополнение к регулярным выражениям для проверки допустимых символов, вы также должны использовать регулярное выражение для проверкина наличие двух подчеркиваний и затем ОБРАТИТЕ этот результат (то есть выкините имя, если оно соответствует образцу).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...