It is the hyphen causing the problem, not the underscore.
A-Z is interpreted as "any uppercase character from A to Z," then "a-z" is interpreted as "any lowercase character from a to z," then "0-9" as "any numeric character," and then the parser hits "_-]" and tries to interpret that as "any character, from underscore to right square bracket" which of course is invalid (because right square bracket is a lower character-code value than underscore).
And even if that did work, then the character-group would be left unclosed since the right square bracket has already been parsed and "consumed."
I recommend escaping the hyphen when not intended as a "range indicator" -- That is, use "\-" to avoid all ambiguity.
Also, see the mod_rewrite [NC] flag, which makes character-matching case-insensitive. In many cases, it can be used to shorten [A-Za-z] to just [A-Z] or [a-z], and eliminates an entire range-comparison step.