As you probably know, parsing html with regex is fraught with danger. Someone is sure to offer you a Dom parser solution, so this answer is mainly to discuss the regex aspects of things.
I usually like to offer a regex solution anyhow, but the task you propose to undertake is truly an appalling one for regex (though no one is blaming you for this). Why?
Semi-colon are not a perfect delimiter of CSS rules
To match and remove rules, you need to know where they stop. For CSS rule, that is semi-colons. But if a CSS rule has a semi-colon aside from the terminating one, the regex will fail. I don't have an example in mind but it's a frequent point of discussion.
In a world without troublesome semi-colons...
If you had your back against the wall and if semi-colons were not a problem, here is one approach that would work in C#, thanks to its infinite-width lookbehind.
(?<=style="[^"]*)(?:(?:text-align|margin)[^";]*;|(\b[^";]*;))
In the replace delegate, using this regex, we would replace the match with an empty string only when capture Group 1 is set.
This time I won't offer sample code as I want to encourage anyone from doing this. Nevertheless, if you were interested in the technique for study purposes, I highly recommend you read this question about matching patterns except in certain contexts.