$ 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
$ [[ "hello" =~ "he" ]] && echo YES || echo NO
YES
$ [[ "hello" =~ he.* ]] && echo YES || echo NO
YES
$ [[ "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:
Quoting the string argument to the [[ command's =~ operator now forces string matching, as with the other pattern-matching operators.
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:
shopt -s compat31
As per the manual:
compat31
If set, bash changes its behavior to that of version 3.1 with respect to quoted arguments to the conditional command's =~ operator.
which causes your command to behave differently:
[[ "hello" =~ "he.*" ]] && echo YES || echo NO
YES
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With