общее соответствие

#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 цифры в любой позиции (?=) .