Регулярное выражение для буквенно-цифровых символов, но не менее одного символа

На моей странице asp.net у меня есть поле ввода, которое должно иметь следующую проверку:

Должен быть буквенно-цифровым, по крайней мере с 1 символом (то есть не может быть ВСЕМИ числами)

6 ответов

Решение
^\d*[a-zA-Z][a-zA-Z0-9]*$

В основном это означает:

  • Ноль или более ASCII цифр;
  • Один буквенный символ ASCII;
  • Ноль или более буквенно-цифровых символов ASCII.

Попробуйте несколько тестов, и вы увидите, что они пропустят любую буквенно-цифровую строку ASCII, где требуется хотя бы один нечисловой символ ASCII.

Ключом к этому является \d* впереди. Без этого регулярное выражение становится гораздо более неловким.

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

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]+)$

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

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

^(?=.*[a-zA-Z].*)([a-zA-Z0-9]{6,12})$
^[\p{L}\p{N}]*\p{L}[\p{L}\p{N}]*$

Объяснение:

  • [\p{L}\p{N}]* соответствует нулю или более Unicode букв или цифр
  • \p{L} соответствует одной букве
  • [\p{L}\p{N}]* соответствует нулю или более Unicode букв или цифр
  • ^ а также $ закрепите строку, убедившись, что регулярное выражение соответствует всей строке. Вы можете пропустить их, в зависимости от того, какую функцию сопоставления регулярных выражений вы вызываете.

Результат: у вас может быть любая буквенно-цифровая строка, за исключением того, что где-то там должна быть буква.

\p{L} похож на [A-Za-z] за исключением того, что он будет содержать все буквы всех алфавитов, с или без акцентов и диакритических знаков. Это гораздо более инклюзивно, используя больший набор символов Unicode. Если вы не хотите заменять эту гибкость [A-Za-z], Аналогичное замечание относится к \p{N} который может быть заменен [0-9] если вы хотите, чтобы все было просто. См. Страницу MSDN о классах символов для получения дополнительной информации.

Менее причудливая не-Unicode версия будет

^[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*$
^[0-9]*[A-Za-z][0-9A-Za-z]*$

это регулярное выражение, которое будет делать то, что вы после. ^ И $ соответствуют началу и концу слова, чтобы запретить другие символы. Вы можете заменить блок [0-9A-z] на \w, но я предпочитаю более подробную форму, потому что при желании ее проще расширять другими символами.

Добавьте валидатор регулярных выражений на свою страницу asp.net в соответствии с руководством по MSDN: http://msdn.microsoft.com/en-us/library/ms998267.aspx.

^\w*[\p{L}]\w*$

Это не так сложно. Регулярное выражение гласит: соответствует строке, начинающейся с любого количества символов слова (букв, цифр, знаков пунктуации (что вам может не понадобиться)), которое содержит один символ буквы (это [\p{L}] часть посередине), а затем снова любое количество символов слова.

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

^[\p{L}\p{N}]*[\p{L}][\p{L}\p{N}]*$

И если вас не волнует Unicode, вы можете использовать скучное выражение:

^[A-Za-z0-9]*[A-Za-z][A-Za-z0-9]*$
^[0-9]*[a-zA-Z][a-zA-Z0-9]*$

Может быть

  • любое число, оканчивающееся символом,
  • или буквенно-цифровое выражение, начинающееся с символа
  • или буквенно-цифровое выражение, начинающееся с числа, за которым следует символ и заканчивающееся буквенно-цифровым подвыражением
Другие вопросы по тегам