Применить несколько условий к группе захвата - PullRequest
1 голос
/ 27 марта 2019

Мне нужно извлечь из текста все слова, соответствующие этим двум требованиям:

  1. Содержит хотя бы одну заглавную букву
  2. Не полностью состоит из заглавных букв.

Итак, Word и WorD являются правильными захватами, но word и WORD не являются.

Итак, я могу перехватить все слова, используя \b([a-zA-Z]+)\b Regex, но я не знаю, как добавить условие заглавных букв здесь.

Что касается требования # 1, я пытался использовать положительный прогноз здесь вот так:

\b(?=.*[A-Z]+)([a-zA-Z]+)\b, но теперь он захватывает все слова из строки, если в этой строке есть хотя бы одна заглавная буква.

Можно ли вообще применить дополнительные условия к группе захвата? Я могу обработать это в коде моего приложения, но я бы действительно предпочел уместить все эти требования в одном Regex.

1 Ответ

1 голос
/ 27 марта 2019

Вы можете использовать

\b(?=[A-Z]*[a-z])(?=[a-z]*[A-Z])([a-zA-Z]+)\b

См. Демоверсию regex

На самом деле вам даже не нужна группа захвата, ([a-zA-Z]+) обычно можно заменить на [a-zA-Z]+, но это зависит от того, где вы используете регулярное выражение.

Детали

  • \b - граница слова
  • (?=[A-Z]*[a-z]) - положительный прогноз, требующий строчных букв после 0+ заглавных
  • (?=[a-z]*[A-Z]) - положительный прогноз, требующий заглавных букв после 0+ строчных
  • ([a-zA-Z]+) - Группа 1: 1 или более букв
  • \b - граница слова.
...