Я хочу проверить имена пользователей согласно этой схеме:
Это регулярное выражение удовлетворяет 1 и 2 выше, но я не могу понять, как удовлетворить 3:
/^[a-zA-Z\d][\w\-]+$/
(я использую Ruby, если это актуально)
Не очень эффективно, но просто:
/^(?!\d+$)[a-zA-Z\d][\w\-]+$/
«Взгляд в будущее» просто означает: «то, что следует, не является строкой чисел, продолжающихся до конца».
Если вы можете сделать два прохода, то более простое и быстрое регулярное выражение второго прохода:
/[^\d]/
Это просто соответствует всему, что не является числом, и оно должно соответствовать только одному, и оно заканчивается рано. Вам не нужно быть строгим здесь, потому что первый проход уже отклоняет недопустимые символы.
Не идеально, но легко: используйте второй проход с регулярным выражением /^.*[a-zA-Z_\-].*$/
/^.*[a-zA-Z_\-].*$/
Просто убедитесь, что он прошел оба, и все будет в порядке.
Еще один способ, хотя он может не работать так же хорошо, как Макс:
/^[a-z0-9][-\w]*[-_a-z][-\w]*$/i
Я бы использовал регулярное выражение, которое вам нужно для проверки, а затем что-то вроде:
passwd.to_i.to_s.length != passwd.length
для проверки того, что passwd не является строкой цифр после того, как она прошла первичную проверку.
passwd