RegEx для сопоставления определенных шаблонов верхнего и нижнего регистра - PullRequest
2 голосов
/ 23 мая 2019

Мне нужно проверить правильность введенной строки с помощью шаблона регулярных выражений, каждое слово должно начинаться с заглавной буквы, также в конце может быть выражение, разделенное "-". Строка должна содержать как минимум два слова или выражения с тире.

, например

правильно:

  • яблочно-банановые куон-даты

  • Яблочный банан

  • Даты банановых купонов

  • Couonut-Дата

неправильно:

  • Apple

  • Яблоко-банан-куон-финики

  • BanAna Couonut-Dates

Pattern pattern = Pattern.compile("([A-Z][a-z]++ )*([A-Z][a-z]++-[A-Z][a-z]++)");
pattern.matcher("Apple Banana Couonut-Dates").matches();

Для ввода "Apple Banana Couonut-Dates" мое выражение возвращает false

1 Ответ

2 голосов
/ 23 мая 2019

Чтобы сопоставить как минимум 2 заглавных слова с необязательной частью с выражением, разделенным - в конце, или одним выражением, отделенным -, вы можете использовать:

^(?:[A-Z][a-z]+(?: [A-Z][a-z]+\b(?!-))+(?: [A-Z][a-z]+-[A-Z][a-z]+)?|(?:[A-Z][a-z]+ )?[A-Z][a-z]+-[A-Z][a-z]+)$
  • ^ Начало строки
  • (?: Группа без захвата
    • [A-Z][a-z]+ Соответствует слову в верхнем регистре
    • (?: [A-Z][a-z]+\b(?!-))+ Повторите 1+ раз слово в верхнем регистре, утверждая, что справане является -
    • (?: [A-Z][a-z]+-[A-Z][a-z]+)? Необязательная часть, место для совпадения и заглавное слово-заглавное слово
    • | Или
    • (?:[A-Z][a-z]+ )? Сопоставление необязательного прописного слова с пробелом
    • [A-Z][a-z]+-[A-Z][a-z]+
  • )$ Конец строки

Regex demo

Обратите внимание на Java, чтобы дважды избежать обратной косой черты.

...