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

Мне нужно, чтобы Regexp для проверки строки имела минимальную длину 6, и она содержит хотя бы один небуквенный символ, например: "eN%{S$u)", "h9YI!>4j", "{9YI!;4j", "eN%{S$usdf)", "dfh9YI!>4j", "ghffg{9YI!;4j".

Это хорошо работает ^.*(?=.{6,})(?=.*\\d).*$", но в случаях, когда строка не содержит чисел (например, "eN%{S$u)"), она не работает.

Ответ 1

^(?=.{6})(.*[^0-9a-zA-Z].*)$

Мы используем положительный прогноз, чтобы обеспечить наличие не менее 6 символов. Затем мы сопоставляем шаблон, который ищет по крайней мере один не-буквенно-цифровой символ ([^0-9a-zA-Z]). .* соответствует любому числу символов вокруг этого одного не-алфавитно-цифрового символа, но к тому времени, когда мы достигли здесь, мы уже проверили, что мы сопоставляем не менее 6.

^.*(?=.{6,})(?=.*\\d).*$"

- это регулярное выражение, которое вы пытались. Вот несколько советов:

  • Вам не нужно сопоставлять более 6 символов в представлении. Соответствие только 6 здесь не ограничивает остальную часть регулярного выражения совпадением более 6.
  • \d соответствует цифре, а (?=.*\\d) - это просмотр для одного из них. Вот почему вы столкнулись с проблемами, которые вы упомянули со строками типа eN%{S$u).
  • Даже если вышеприведенная точка не была неправильной, и регулярное выражение здесь было правильным, вы можете комбинировать второй lookahead с .*, который следует, просто используя .*\\d.*.

Ответ 2

Ответ marcog довольно хорош, но я бы сделал это наоборот, чтобы было проще добавить еще больше условий (например, иметь хотя бы одну цифру или что-то еще), и я бы использовал ленивые квантификаторы, потому что они дешевле для определенных моделей:

^(?=.*?[^0-9a-zA-Z]).{6}

Итак, если вы хотите добавить указанное дополнительное условие, оно будет выглядеть следующим образом:

^(?=.*?[^0-9a-zA-Z])(?=.*?[0-9]).{6}

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

Ответ 3

Сохраняйте это.

// long enough  and  contains something not digit or a-z
x.Length >= 6   &&   Regex.IsMatch(x, @"[^\da-zA-Z]")

Счастливое кодирование.

Изменить, чистое "регулярное выражение":

Вначале утверждается, что в обзоре есть 6 букв, а затем гарантирует, что в ожидании впереди есть что-то, что не является буквенно-цифровым (оно "выбросит" до первых 5 символов, пытающихся для соответствия).

(?=.{6}).{0,5}[^\da-zA-Z]

Ответ 4

Как насчет этого (исправлено): ^(?=.{6})(.*[^\w].*)$

Отметьте http://www.ultrapico.com/Expresso.htm, это отличный инструмент, который может помочь вам в обучении Regexps.