Нежадный рисунок с продвинутыми персонажами - PullRequest
1 голос
/ 31 октября 2019

У меня есть простой шаблон, которому я хочу соответствовать. В этом предложении:

great. This is great&great&great. great.

Я хочу сопоставить только 'великих' слов сразу после 'Это есть'. Таким образом, первый великий не будет возвращен, но следующие три должны быть. Последнее не должно быть.

Мое выражение

This is (great&)*?(great)

Но это возвращает только первое великое. Я читал о жадных и не жадных шаблонах, и это прекрасно работает, когда мне не нужно беспокоиться о прогрессе «Это есть». Но проверка этих символов важна для моего случая использования. Как бы я получил требуемый результат?

Я могу сделать эту работу с:

This is (great&){0}(great)

для первого матча,

This is (great&){1}(great)

для второго,и так далее. Но это громоздкое решение, и я думаю, что мне чего-то не хватает в поведении не жадных шаблонов. Ценю любую помощь. Спасибо!

1 Ответ

2 голосов
/ 31 октября 2019

Один из вариантов - использовать чередование и сопоставить то, что вам не нужно, и использовать группу захвата для great между границами слов.

^.*?This is |\b(great)\b
  • ^ Начало строки
  • .*?This is Соответствует первому вхождению This is с использованием ленивого квантификатора .*?
  • | Или
  • \b(great)\b Захват великиймежду границами слов в группе 1

См. Regex demo

Обновление

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

(?:(?<=\bThis is )|(?<=\S))\bgreat\b
  • (?: Группа без захвата
    • (?<=\bThis is ) положительный взгляд сзади, утверждают, что слева - This is
    • | Или
    • (?<=\S) Положительный взгляд сзади, утверждение, что слева - символ без пробелов
  • ) Закрытьгруппа без захвата
  • \bgreat\b Отличное соответствие между границами слов

Regex demo

...