Первоначально у меня было требование, чтобы я проверял, следует ли заданная строка следующим двум шаблонам.
"^(.{1,5})?$"
- предназначен для проверки длины строки до 5 символов
"[!-~]|([!-~][ -~]*[!-~])"
-Это означает, что строка не начинается или заканчивается пробелами.
Ранее мы должны были выдавать два разных сообщения, когда строка не совпадает ни с одним, поэтому я обработал, как показано ниже:
Pattern pattern1 = Pattern.compile("^(.{1,5})?$");
Pattern pattern2 = Pattern.compile("[!-~]|([!-~][ -~]*[!-~])");
Matcher matcher1=pattern1.matcher(" verify");
Matcher matcher2 = pattern2.matcher("verify");
System.out.println("Message1 - " + matcher1.matches());
System.out.println("Message2 - " + matcher2.matches());
Но теперь требуется следующее:
- Нам нужно забить обе вышеупомянутые схемы, НО
- Включите также, что строка может содержать следующие символы $, #, @, отличные от букв, число
- И дать одно сообщение.
Я посмотрел на много похожих вопросов, таких как:
регулярное выражение без пробелов в начале и в конце, но в середине допускается
и https://regex101.com/ для создания одного регулярного выражения, например:
Pattern pattern3=Pattern.compile(
"^[^\\\s][[-a-zA-Z0-9-()@#$]+(\\\s+[-a-zA-Z0-9-()@#$]+)][^\\\s]{1,50}$");
Но регулярное выражение работает неправильно.
Если я предоставлю строку с символом, отличным от упомянутого в регулярном выражении, например "%", она должна была завершиться с ошибкой, но она прошла.
Я пытаюсь выяснить, что является проблемой в приведенном выше регулярном выражении или любом новом регулярном выражении, которое может удовлетворить потребность.
@ изменить, чтобы быть более понятным:
Допустимый ввод: "Ад @"
Неверный ввод: "Ад" (есть пробел @ начало)
Неверный ввод: «Ад%» содержит необязательный символ «%»