Totally open for suggestion on how to fix this - right now I'm using regex and a list of "profane" words, so nothing too fancy. But I'm interested in looking into solutions for this problem.
There is no easy solution. Look at that TVTropes page for a long list of failure cases.
Could be interesting to include an optional argument callback that would receive the part of the string that's being censored and returns a string to replace that part of the word with - so that you can conditionally prevent censorship or censor it with something else than *.
You mean change it to a less offensive word? That would actually be interesting.
So if I write BbitchIbitchTbitchCbitchHbitch, it would give me B * I * T * C * H ?