Regex, соответствует не-символам один или несколько раз - PullRequest
0 голосов
/ 08 декабря 2018

У меня проблемы с этим фрагментом кода, в частности с кодом внутри цикла while.

public void mSetSafeCode() // Manually define safe passcode
{
    int mIntPasscode;
    String mStringPasscode;
    Scanner sc = new Scanner(System.in);

    System.out.print("Enter your desired numerical passcode (max 3 digits): ");
    mStringPasscode = sc.nextLine();
    while(mStringPasscode.matches("\\D+") || mStringPasscode.length() > 3 || mStringPasscode.length() < 3) // If input not digit or exceeds length
    {
        System.out.print("Error! You inputted an invalid passcode, try again: ");
        mStringPasscode = sc.nextLine(); // Prints error, gets user to input again
    }
    mIntPasscode = Integer.parseInt(mStringPasscode); // If while is not met, parses input into an integer
    System.out.println("You've set the numerical passcode to " + mIntPasscode); // Prints the passcode
}

Я пытаюсь сделать так, пока пользовательский ввод со сканера содержит символы, которые не являютсяцифры, чтобы скинуть ошибку.Я считаю, что мое регулярное выражение правильно с \\D+, но если бы я использовал, например, 'f33' в качестве входных данных, он не попадал в цикл while.Я думаю, это потому, что я использую или с длиной строки, но я хочу, чтобы она была перехвачена циклом while, если он содержит символ (не цифру) или если его длина больше / меньше 3.

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 08 декабря 2018

Использование [0-9]{3} приведет к совпадению только для 3 цифр.[\\d]{3} также будет работать.

0 голосов
/ 08 декабря 2018

Если вы разрешите только 3 числа, лучше написать

[0-9]{1,3}
0 голосов
/ 08 декабря 2018

В вашем цикле while есть:

while(mStringPasscode.matches("\\D+")

Вы хотите, чтобы оно было:

while(!mStringPasscode.matches("\\d+")

Объяснение:

\\D+ соответствует не цифрам, но это будет соответствовать, только если весь String не является цифрой.Вы хотите использовать \\d+, который будет возвращать false, если любой из символов в String не является числовым.String#matches соответствует целому String, поэтому, если есть один символ, который не соответствует, он вернет false.


while(!mStringPasscode.matches("\\d+") || mStringPasscode.length() != 3) 
{
    System.out.print("Error! You inputted an invalid passcode, try again: ");
    mStringPasscode = sc.nextLine(); // Prints error, gets user to input again
}

Пример вывода:

Enter your desired numerical passcode (max 3 digits): 34f
Error! You inputted an invalid passcode, try again: fff
Error! You inputted an invalid passcode, try again: 45645323
Error! You inputted an invalid passcode, try again: ff
Error! You inputted an invalid passcode, try again: 456
You've set the numerical passcode to 456
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...