Regex, который выражает “по крайней мере одну нецифру”

Я хочу проверить имена пользователей согласно этой схеме:

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

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

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

(Я использую Ruby, если это релевантно),

8
задан Tom Lehman 24 January 2010 в 04:08
поделиться

5 ответов

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

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

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

11
ответ дан 5 December 2019 в 12:58
поделиться

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

Просто убедитесь, что он проходит как и все Отказ

1
ответ дан 5 December 2019 в 12:58
поделиться

Если вы можете пройти два прохода, то более простой и быстрый второй проход регеxp - это:

/[^\d]/

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

1
ответ дан 5 December 2019 в 12:58
поделиться

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

/^[a-z0-9][-\w]*[-_a-z][-\w]*$/i
0
ответ дан 5 December 2019 в 12:58
поделиться

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

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

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

0
ответ дан 5 December 2019 в 12:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: