Ошибка в Regex для набора символов, фиксированной длины и шагов в начале и конце строки - PullRequest
0 голосов
/ 19 января 2019

Первоначально у меня было требование, чтобы я проверял, следует ли заданная строка следующим двум шаблонам.

  • "^(.{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}$");

Но регулярное выражение работает неправильно. Если я предоставлю строку с символом, отличным от упомянутого в регулярном выражении, например "%", она должна была завершиться с ошибкой, но она прошла.

Я пытаюсь выяснить, что является проблемой в приведенном выше регулярном выражении или любом новом регулярном выражении, которое может удовлетворить потребность.

@ изменить, чтобы быть более понятным: Допустимый ввод: "Ад @"

Неверный ввод: "Ад" (есть пробел @ начало)

Неверный ввод: «Ад%» содержит необязательный символ «%»

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вы можете использовать это регулярное выражение:

^(?!\s)[a-zA-Z\d$#@ ]{1,5}(?<!\s)$

Демонстрация RegEx

Подробности RegEx:

  • ^: Старт
  • (?!\s): отрицательный взгляд вперед, не допускайте пробела при запуске
  • [a-zA-Z\d$#@ ]{1,5}: разрешить эти символы в диапазоне от 1 до 5
  • (?<!\s): отрицательный вид сзади, не допускать пробела до конца
  • $: конец
0 голосов
/ 19 января 2019

Вот шаблон, который должен соответствовать вашим двум требованиям:

^\S(?:.{0,3}\S)?$

Это говорит о совпадении:

\S        an initial non whitespace character
(
    .{0,3}    zero to three of any character (whitespace or non whitespace)
    \S        a mandatory ending whitespace character
)?        the entire quantity optional

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...