#regex
#регулярное выражение
Вопрос:
выполнить поиск по одному символу в регулярном выражении несложно.
exp: хотя бы одна цифра:
d
итак, мне нужно сопоставить как минимум 2 цифры в тексте
.*d{2}.* or .*dd.* #### "d2dr5" -> not match... d22r or d00r match..
не сработает, потому что движок регулярных выражений ищет эти числа как последовательные, как я могу выполнить поиск в целом? например
Я хочу, чтобы в тексте совпадало как минимум 3 цифры и 2 слова в верхнем регистре. и длина текста может быть не более 12. как я могу это сделать? Если вы можете привести объясненный пример, тогда у меня может быть смысл для повторного поиска
пример соответствия:
a9r2lDpDf2 — совпадает. не менее 3 цифр 2 в верхнем регистре и не более 12 символов в общей сложности.
Комментарии:
1. пожалуйста, приведите больше примеров, чтобы проиллюстрировать правила. Будет ли соответствовать следующее. A5T6at, AA666, AA6666, 6AAAAA6AA6, $$amp;amp;EEE%U
2. Вы пытаетесь проверить надежность пароля? (Помогает ответить на вопросы, если мы знаем, почему у вас возник этот вопрос.)
3. @amal ваше первое не совпадает, потому что требуется как минимум 3 цифры. все остальные совпадения. @Richard эти комбинации часто используются для определения надежности пароля, но здесь я хочу узнать, как добиться общего соответствия.
Ответ №1:
Если вы хотите убедиться, что в строке всего три цифры, вы можете попробовать это (при необходимости добавьте начало и конец строки):
[^d]*d[^d]*d[^d]*d[^d]*
[^d]*
— что угодно, кроме цифр.
Тот же шаблон можно использовать для проверки наличия прописных букв:
[^A-Z]*[A-Z][^A-Z]*[A-Z][^A-Z]*
Регулярное выражение — не лучший инструмент для проверки длины. Используемый вами язык имеет что-то вроде length(str)
или str.length
или str.length()
и т.д.
Это может быть сделано с помощью функции предварительного просмотра. Вот как выглядит регулярное выражение в Perl (и оно выполняет то, что вы просите):
/^(?=.*d.*d.*d)(?=.*[A-Z].*[A-Z]).{12}$/
(?=.*d.*d.*d)
— «смотрит вперед», чтобы увидеть, есть ли 3 цифры
(?=.*[A-Z].*[A-Z])
— «смотрит вперед», чтобы увидеть, есть ли 2 заглавные буквы
.{12}
— длина должна составлять ровно 12 символов. Любой символ 12 раз.
Комментарии:
1. Я хочу, чтобы в тексте совпадало как минимум 3 цифры и 2 слова в верхнем регистре. и длина текста может быть не более 12
2. Привет, Треш, я думаю, ты не понял моего вопроса. Я хочу объединить эти требования в одном регулярном выражении.
3. Использовать эти два последовательно намного проще. Почему у вас есть ограничение на использование только одного регулярного выражения?
4. Какой вариант регулярного выражения используется
u
для сопоставления заглавных букв?5. @Alan Мне показалось, что я это где-то видел. Может быть, никто. Я удалю его. Спасибо
Ответ №2:
Я не думаю, что регулярные выражения являются оптимальным решением здесь, но для академического интереса
(?=(.*[0-9]){3})(?=(.*[A-Z]){2}).{5,12}
Комментарии:
1. (?=) — это выражение для прогнозирования нулевой ширины. Это означает, что он будет искать в строке указанный шаблон, если его там нет, то совпадения не будет. Таким образом, регулярное выражение считывает любой символ, встречающийся 5-12 раз, и строка должна содержать 2 символа верхнего регистра в любой позиции (?=) и 3 цифры в любой позиции (?=) .