I've found a workaround for testing of -F has been given in one go – via the super cool negation `~`:
QE='zparseopts qqq -F afwe'
print ${QE//(#b)zparseopts(*~*-F*~*-)(-F|)*/°match°}
printf °%s\\n "$match[@]" $?
Output:
°match°
° qqq
°-F
°0
So the -F exists there in $match[3] for testing if it has been given to zparseopts. The main point is the ~ rejection of -F on part of the input string:
…(*~*-F*~*-)…
It translates: everything (*) but not -F (~*-F*) and in that subset, also not dash = (~*-). Without the ~*- it would match "not -F", so "-" from within it is still allowed:
QE='zparseopts qqq -F afwe'
print ${QE//(#b)zparseopts(*~*-F*)(-F|)*/°match°}
printf °%s\\n "$match[@]" $?
Output:
°match°
° qqq -
°
°0
With it and with ~*-F* it correctly accepts other options:
QE='zparseopts qqq -q -F afwe'
print ${QE//(#b)zparseopts(*~*-F*~*-)(-F|)*/°match°}
printf °%s\\n "$match[@]" $?
Output:
°match°
° qqq -q
°-F
°0
I think that this demonstrates the uniqueness of Zsh pattern negations. That really should be available in regexps.