in reply to RegEx to match at least one non-adjacent term

Actually, your references to numbers has been leading us on a wild goose chase. It seems to me that all you want to do is delete any form of "bad" color words from the user input. The following regex will do that nicely: s/\b(re?d?)\b/ /gi. It replaces your r, re, red, rd by a space (to avoid running numbers together). Collapsing multiple spaces is easy in a separate regex and left as an exercise for the readers. The whole trick is in the \b which is a zero width assertion matching the boundary between a word and a non-word character.

Update: Forget what I said, it won't work on something like "1234red5678". If I change the regex to work on this, I arrive at ikegami's solution.

CountZero

A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James