'Regex - Find all matching words that don't begin with a specific prefix

How would I construct a regular expression to find all words that end in a string but don't begin with a string?

e.g. Find all words that end in 'friend' that don't start with the word 'girl' in the following sentence:

"A boyfriend and girlfriend gained a friend when they asked to befriend them"

The items in bold should match. The word 'girlfriend' should not.



Solution 1:[1]

This may work:

\w*(?<!girl)friend

you could also try

\w*(?<!girl)friend\w* if you wanted to match words like befriended or boyfriends.

I'm not sure if ?<! is available in all regex versions, but this expression worked in Expersso (which I believe is .NET).

Solution 2:[2]

Try this:

/\b(?!girl)\w*friend\b/ig

Solution 3:[3]

I changed Rob Raisch's answer to a regexp that finds words Containing a specific substring, but not also containing a different specific substring

\b(?![\w_]*Unwanted[\w_]*)[\w_]*Desired[\w_]*\b

So for example \b(?![\w_]*mon[\w_]*)[\w_]*day[\w_]*\b will find every word with "day" (eg day , tuesday , daywalker ) in it, except if it also contains "mon" (eg monday)

Maybe useful for someone.

Solution 4:[4]

In my case I needed to exclude some words that have a given prefix from regex matching result

the text was query-string params

?=&sysNew=false&sysStart=true&sysOffset=4&Question=1

the prefix is sys and I dont the words that have sys in them

the key to solve the issue was with word boundary \b

\b(?!sys)\w+\b

then I added that part in the bigger regex for query-string

(\b(?!sys)\w+\b)=(\w+)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 morja
Solution 3 nl-x
Solution 4 Basheer AL-MOMANI