Grep regular expression

I want to track only below:

I am using below, but it doesn't work:

$ cat file
=(root)NOPASSWD:/usr/bin/vim
=(ALL)NOPASSWD:/usr/bin/vim
=NOPASSWD:/usr/bin/vim
=(user)NOPASSWD:/usr/bin/vim
$ egrep '=(\(root\)|\(ALL\))?NOPASSWD' file
=(root)NOPASSWD:/usr/bin/vim
=(ALL)NOPASSWD:/usr/bin/vim
=NOPASSWD:/usr/bin/vim

This doesnt give any output, the file content is:

=(root)NOPASSWD:/usr/bin/vim
=(ALL)NOPASSWD:/usr/bin/vim
=NOPASSWD:/usr/bin/vim
=(user)NOPASSWD:/usr/bin/vim
< sudo.txt tr -d "[:blank:]" | egrep '=(\((ALL|root)\))?([[:alpha:]]+:)?/usr/bin/vim'

Explanation of the (\((ALL|root)\))? :
The inner ( ) are for the | scope: ALL OR root.
Then there are the literal parens \( \) around it.
And then there are another ( ) around this for the ? scope: match zero or once.
Note that the greedy .* "match all" often matches too much.

This works.

Now how do i match below:

=(root)ALL
=(root:root)ALL
=(root)NOPASSWD:ALL
=(root:root)NOPASSWD:ALL

=(ALL)ALL
=(ALL:ALL)ALL
=ALL
=NOPASSWD:ALL

Quick hack: allow : in addition to ALL and root , allow one or more instances with +

< sudo.txt tr -d "[:blank:]" | egrep '=(\((ALL|root|:)+\))?([[:alpha:]]+:)?ALL'

This is not 100% precise, because it would also match ALLroot rootALL ALLALL rootroot.

No output