Ziad Ahmed Khan Ответов: 1

Моя программа дает правильный вывод, но она все еще терпит неудачу в одном из тестовых случаев для неверного пароля, я все еще не понимаю, почему ?


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

Минимум 8 символов
Должен содержать по крайней мере один верхний регистр, один нижний регистр и один специальный символ.
Допускаются только специальные символы@,*,#.

Если код не соответствует этим критериям, он должен реагировать следующим образом:
Неверный Код Безопасности, Попробуйте Еще Раз!

Что я уже пробовал:

Я написал следующий код:
import java.util.Scanner;
import java.util.regex.Pattern;


public class Main { 
    public static void main(String[] args) 
    { 
        Scanner scanner = new Scanner(System.in);
        
        System.out.println("Generate your Security Code ");
        // reading security code from user
        String securityCode = scanner.nextLine();
        
        // regex pattern for given security code pattern
        // this pattern is matches if atleast 8 characters, one upper case,
        // one lower case and one special character from @,*,# 
        String pattern = "^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[#@*]).{8,}$";
        
        // checking whether security code is matching with pattern or not
        if (Pattern.matches(pattern, securityCode)) {
           // security code is matched with pattern
           System.out.println("Security Code Generated Successfully");
        } else {
           
           // security code not matched with pattern
           System.out.println("Invalid Security Code, Try Again!");
        }
      
    } 
}

1 Ответов

Рейтинг:
9

OriginalGriff

Попробуйте сделать это с помощью этого пароля:

g*H&&&&&
Он имеет длину 8 символов, содержит разрешенный специальный символ, нижний регистр и верхний регистр - но он недействителен.

Не используйте для этого регулярное выражение: подсчитайте верхние, нижние, разрешенные специальные предложения и другие отдельно, а затем проверьте правильность пароля по этим подсчетам: регулярные выражения отлично подходят для сопоставления шаблонов, но они плохо учитываются, и вам нужно считать!
Допустимыми числами являются
upper                > 0
lower                > 0
permitted specials   > 0
others               = 0
upper + lower + permitted specials >= 8
Вы не можете легко сделать это с регулярным выражением, и если вы это сделаете, оно станет недоступным очень, очень быстро.


Ziad Ahmed Khan

Отличный ответ я понимаю вашу точку зрения, но разрешенные специальные символы-это*,@, # использование '&' приведет к тому, что он выдаст вывод как недействительный

Ziad Ahmed Khan

Я использовал вашу логику и написал код следующим образом:

импорт java.util.Сканер;
публичный класс SecurityCode {

публичный статический пустота главный(строка[] аргументы) {
Сканер Reader = новый сканер(System.in);
Строковый код;
int upper = 0, lower = 0, special = 0;
флаг int = 0;
делать{
//мы берем ввод защитного кода
System.out.print("сгенерируйте защитный код: ");
код = reader.nextLine();
//мы получаем длину строки с помощью метода length()
int len = код.длина();
флаг = 0;
//мы проверяем количество прописных букв
//мы проверяем количество строчных букв
//мы проверяем наличие специального символа
//мы ничего не делаем, если есть цифра
//мы меняем флаг на 1 символ, не соответствующий ни одному из критериев
//это означает, что у нас другой характер
for(int i = 0; i<len; i++){
="" если(код.используя метод charat(я)="='@'" ||="" код.используя метод charat(я)="='#'" специальный++;
="" }еще="" если(персонаж.islowercase(код.используя метод charat(я))){
="" нижний++;
="" если(персонаж.isuppercase(код.используя метод charat(я))){
="" верхний++;
="" если(персонаж.isdigit(код.используя метод charat(я))){
=""
="" }еще{
="" флаг="1;
" }
="" если="" наши="" длина="" является="" 8="" и="" выше="" сверху,="" нижней="" специальные="" знаков
="" являются="" есть="" затем="" в="" поколения="" из="" безопасности="" кодекса="" успешной
="" в противном случае="" мы="" берем="" ввод="" снова
="" если(длн=""&ГТ;=8 &амп;&амп; верхний&ГТ;0 &&усилителя; низкий и gt;0 &&усилителя; специальные&ГТ;0 &амп;&амп; флаг == 0){
System.out.println("код безопасности успешно сгенерирован.");
перерыв;
}еще{
System.out.println("неверный код безопасности, попробуйте еще раз!");
}
}while(true);
}
}



Теперь он терпит неудачу для 2 тестовых случаев неверного пароля

OriginalGriff

- Да, я знаю. Это то, что позволяет ваше регулярное выражение!
Вот почему вместо этого вы используете подсчеты: считайте символы как группы, а затем проверяйте количество групп. Регулярное выражение не позволит вам этого сделать.

OriginalGriff

Подсказка: создайте четыре целых числа: нижнее, верхнее, специальное, другое.
Создайте цикл для просмотра каждого символа в предоставленном пароле.
Если символ строчный, увеличьте его значение ниже
Если символ прописной, увеличьте верхний регистр
Если символ находится в разрешенных специальных предложениях, увеличьте значение Special.
В противном случае увеличьте другие
После цикла проверьте количество отсчетов.