Проблема в регулярном выражении для набора символов, фиксированной длины и шага в начале и конце строки

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

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

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

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

@edit для большей ясности: Допустимый ввод: "Hell @"

Недействительный ввод: "Hell" (имеет пробел @beginning)

Недопустимый ввод: "Hell%" не обязательны для символов char '%'


person Golu    schedule 19.01.2019    source источник
comment
Почему это нужно делать только с регулярными выражениями? Вы можете проверить длину строки от 1 до 5, просто вызвав length (), и вы можете проверить Character.isWhitespace (string.charAt (0)) и length () - 1 для последнего символа.   -  person emilles    schedule 19.01.2019
comment
@anubhava добавил более четкие данные   -  person Golu    schedule 19.01.2019
comment
@emilles у нас есть определенная структура, которая использует регулярное выражение и выполняет все функции, поэтому нам не нужно использовать java-методы, потому что требования, такие как длина, будут различаться для каждого шаблона, и тогда нам придется снова писать код и agian   -  person Golu    schedule 19.01.2019
comment
@RamandeepSingh: Hello@ имеет 6 символов, но вы упомянули, что разрешено только до 5?   -  person anubhava    schedule 19.01.2019
comment
Это нормально, но сбивает с толку то, что ваш пример написан на Java. Вы могли бы привести пример чистого регулярного выражения вместе с примерами входных данных.   -  person emilles    schedule 19.01.2019
comment
@anubhava да спасибо, я поправил   -  person Golu    schedule 19.01.2019


Ответы (2)


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

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

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

Сведения о регулярном выражении:

  • ^: Начать
  • (?!\s): отрицательный просмотр вперед, не оставлять пробела в начале
  • [a-zA-Z\d$#@ ]{1,5}: Разрешить эти символы длиной от 1 до 5.
  • (?<!\s): Отрицательный просмотр назад, не оставлять пробелов до конца
  • $: Конец
person anubhava    schedule 19.01.2019
comment
Спасибо @anubhava, это сработало отлично, на самом деле мне нужно было немного настроить, и я смог это сделать regex101. com / r / 3oMrRn / 1 - person Golu; 19.01.2019
comment
Вы можете сократить свое регулярное выражение до этого: /^(?!\s)[][\w!"#$%&'*+.:=@,\/;<>?#@^()`{}~ -]{1,5}(?<!\s)$/ - person anubhava; 19.01.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

Демо

person Tim Biegeleisen    schedule 19.01.2019