Is this still not working as expected when you combine even just a couple of the ranges? I don't think that using multiple ranges and the bitwise or (|) op is doing what you want once it's expanded inside of the char class brackets.
Unless performance is a really big problem, if you can't combine the classes for whatever reason, or don't want to, try storing each class string in an array and go through it running the substitution once per char class on the source text. It'll get the job done.
Good luck!