grep doesn't understand
\s or parentheses.(*) You want
grep -P if available, or
egrep and write
\s out as
[ ^I] (where
^I is Tab;
-P doesn't understand
\t either). Additionally, with double quotes some shells will process the
\s and leave behind just
s; you should always use single quotes with regexes from the shell, except for when you actually need to interpolate a variable (e.g. something like
'^\s*'"$foo"'\s+\(', switching quoting in mid-parameter).
The alternatives in your second example (again, with
-P and single quoting instead of double) do the same thing. The former is technically better because
grep won't backtrack as much, but practically it won't matter.
(*) pedantry: backslashed parens will work, again requiring single quoting so the shell doesn't eat the backslashes.
egrep is usually easier.