Как насчет этого:
string s = "<abc> <>sdfsd <dfsdf></abc><def><movie></def>";
string regex = "<(?!/?(?:abc|def)>)|(?<!</?(?:abc|def))>";
string result = Regex.Replace(s, regex, match =>
{
if (match.Value == "<")
return "<";
else
return ">";
});
Console.WriteLine(result);
Результат:
<abc> <>sdfsd <dfsdf></abc><def><movie></def>
Кроме того, при тестировании на другом тестовом примере (который, кстати, я нашел в комментарии к другому вопросу):
<abc>>sdfsdf<<asdada>>asdasd<>asdasd<asdsad>asds<</abc>
Я получаю этот результат:
<abc>>sdfsdf<<asdada>>asdasd<>asdasd<asdsad>asds<</abc>
Позвольте мне угадать ... это не работает для вас, потому что вы только что подумали о новом требовании? ;)