The problem is that you have .? after the negative lookahead, which means the regex can: NOT match either of your two words with 'ild ' or 'oderate ', then ignore the . because it is optional and then match 'active'.
Now, you might think that just removing the ? would force it to work by matching the space (I did initially), but: when the preceding word is 'mild', it can match that by NOT matching the word moderate; and vice versa, so still every instance of active will match.
This works (though it will also (for example) not match 'elaborate active' should that appear):
my $re = qr[(?<!mild|rate)\s+active];
Negative lookbehinds have to be fixed length (hence the truncation of moderate).
Update: rather than risking mismatches caused by the truncation of the longer word, you could pad the shorter word: my $re = qr[(?<!....mild|moderate)\s+active];
if you think that will be less likely to cause mismatches.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
|