text = Regex.Replace(text, @"(.*)((?<!(\A|<blockquote>|</blockquote>|</p>))(<blockquote>|<p>))", "$1</p>$2", RegexOptions.IgnoreCase | RegexOptions.Compiled);
I'm at a loss to explain why, because I've never had any expression choke like that. I theorize that it might have something to do with the "or" options in the groups, but I don't know for sure. Or perhaps something is causing it to recursively scan the entire text over and over, I'm just not sure what.