$ man bash
Word splitting and filename expansion are not performed on the words between the ‘[[’ and ‘]]’; tilde expansion, parameter and variable expansion, arithmetic expansion, command substitution, process substitution, and quote removal are performed.
$ echo $BASH_VERSION
4.2.10(1)-release
command 1
$ [[ "hello" =~ "he" ]] && echo YES || echo NO
YES
command 2
$ [[ "hello" =~ he.* ]] && echo YES || echo NO
YES
command 3
$ [[ "hello" =~ "he.*" ]] && echo YES || echo NO
NO
Why command 2 and 3 are different?
Check your bash version. Starting from version 3.2 this behavior was added that states:
I guess you are using bash >= ver 3.2 for your test.
That’s the reason when you quote the regular expression it is doing plain simple string matching instead of regex matching.
Update: If you want regex matching inside double quotes then use:
As per the manual:
which causes your command to behave differently: