The problem is that it's far more trivial to bypass the filters than it is to make the filters work well and not have false positives.
Consider: sh1t, cu|\|7, a55, f00ker, and so on and so on.
Plus you have to constantly update to take into account new slang which can have double meaning. Some kid might say "she's just a thirsty ratchet" and there's no way in hell that a simplistic automated system is going to be able to flag that as being a use of expletives or filthy and derogatory language.