Since the regexp engine doesn't really have an "and" feature that provides layering, your solution is decent. I do have one comment though. I'm not sure if you're aware, but the '.' (dot) inside of the character classes is going to be taken literally, as a character. In other words:
[$polar.$charged]
Means any single character of the following set:
D E H A W . D G Y A H
I put the dot in there as a character, not an operator.
Inside a character class (and inside quoted strings in general) you don't use the dot as a concatenation operator. The strings are interpolated and concatenated all at once, and the dot is a literal character, in such contexts.
Dave
"If I had my life to do over again, I'd be a plumber." -- Albert Einstein