My suggestion would be:
^(?=(.*?[\d%_!+-]){2})[a-z].{7,14}$
This assumes that the 'ignore case' option is set. If you want to, you can change the '[a-z]' to '[a-zA-Z]' to make just this part case insensitive. Also, this does all pf the tests you mention in the single regex.
If the set of "special characters" is to be altered, then simply change the character set within the lookahead.
Note that the final quantifier has the min and max values 1 less than those you specified because of the leading alpha check.
I have not added any quoting etc that may be needed to make this suitable for javascript.
Susan