.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.