Q:

Non-greedy pattern with advance characters

I have a simple pattern that I want to match. In this sentence:
great. This is great&great&great. great.

I want to match only the 'great' words immediately following 'This is'. So the first great would not be returned, but the next three have to be. The last should not be.
My expression is 
This is (great&)*?(great)

But this returns only the first great. I read up about greedy and non-greedy patterns, and it works great when I don't have to worry about the advance 'This is'. But these advance characters check is important for my use case. How would I get the required result?
I am able to make this work with:
This is (great&){0}(great)

for the first match,
This is (great&){1}(great)

for the second, and so on. But it is a cumbersome solution, and I think I am missing something about the behavior of non-greedy patterns. Appreciate any help. Thanks!

A:

One option is to use an alternation and match what you don't want and use a capturing group for great between word boundaries.
^.*?This is |\b(great)\b

^ Start of string
.*?This is  Match the first occurrence of This is  using a lazy quantifier .*?
| Or 
\b(great)\b Capture great between word boundaries in group 1

See a Regex demo
Update
A possible solution to the updated question might be using 2 positive lookbehinds inside an alternation.
(?:(?<=\bThis is )|(?<=\S))\bgreat\b

(?: Non capturing group

(?<=\bThis is ) positive lookbehind, assert what is on the left is This is 
| Or
(?<=\S) Positive lookbehind, assert what is on the left is a non whitespace char

) Close non capturing group
\bgreat\b Match great between word boundaries

Regex demo

