I think the main difference between using regular expression is whether they require to match the whole string or not. In
find and some other bash commands you have to match the whole string, while in
grep and so on you have to match any part of the string. Other than that they are similar, but, of course, not identical.
For example, when you use regular expression in
case statements of bash shell, it is assumed that your regular expression describes the whole string. I.e. (i'm using example here)
case $SERVER in
db-[0-9]+\.host\.com) echo "DB server"
*)echo "Unknown server"
You can see that db-[0-9]+.host.com describes the string, which starts with "db-", then has one or more digits, and then ends with ".host.com", so db-1.host.com will match, while xdb-1.host.com will not.
Now if you look at
sed, and write the search pattern in a similar way
echo "xdb-1.host.com"| sed -nr '/db-[0-9]+\.host\.com/p'
case command, WILL print the line xdb-1.host.com, because it can find the search pattern INSIDE this string. So, the idea is not to match the whole string, but to find any occurence of the pattern.
In a similar way, if you use regexp in
find command, the whole string has to match. For example,
find / -regextype sed -regex ".*\.dat"
will find you all the files, which have the extension dat. But if you try to do the same search with
find / | sed -nr '/.*\.dat/'
it will match all the files, which contain the string ".dat" in their file name.
There are also some minor syntax differences of course. For example if you do
find / -name "*.dat"
this is also a kind of regular expression, where * means "any number of arbitrary symbols", but in the strict sense regexp you should write ".*", where "." means any symbol, and * means any number of symbols of kind ".", so together meaning any number of any symbols.