2010-01-24 4 views
8

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

  1. Допустимые символы: буквы, цифры, дефис, подчеркивание
  2. Первый символ должен быть буквой или номер
  3. Имя пользователя, не может быть все номера

Это регулярное выражение удовлетворяет 1 и 2 выше, но я не могу понять, как удовлетворить 3:

/^[a-zA-Z\d][\w\-]+$/ 

(я использую Ruby, если это уместно)

ответ

10

не очень эффективным, но просто:

/^(?!\d+$)[a-zA-Z\d][\w\-]+$/

опережения просто означает: «то, что следует не является строкой числа, которые продолжаются до конца ».

+0

аккуратный трюк, он доступен в реализациях регулярных выражений, не рубин? –

+0

+1 Хороший. Обычно я избегаю взглядов, потому что я не очень хорошо их понимаю, но это хорошая иллюстрация о том, как их использовать. –

+0

@Mark: Не во всех, но в большинстве. Python, PHP, Perl и Javascript - это те, которые, как я знаю, поддерживают его. –

1

Не идеально, но просто: используйте второй проход с регулярным выражением /^.*[a-zA-Z_\-].*$/

Просто убедитесь, что он проходит как и вы будете в порядке.

+2

'/ \ D /' будет делать то же самое, если вы запустите второй фильтр. Нет необходимости в совпадении от начала до конца. –

+0

Второй проход может быть просто '[-a-z_]' (я предполагаю, что вы делаете нечувствительный к регистру совпадение, а если нет, то '[-A-Za-z_]', конечно. о начале, конце или чем-то еще - если он пройдет первый, просто убедитесь, что где-нибудь есть письмо, подчеркивание или дефис. – Jay

+0

Спасибо, я не был уверен в Ruby, но Java сообщает только совпадение, если вся строка Я полагаю, что \ D не является цифрой? –

1

Если вы можете пойти с двумя проходами, проще и быстрее второй проход регулярное выражение:

/[^\d]/ 

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

0

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

passwd.to_i.to_s.length != passwd.length 

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

0

Еще один способ, хотя он не может выполнить, а также Макса:

/^[a-z0-9][-\w]*[-_a-z][-\w]*$/i 
Смежные вопросы