it is very hard to do nested matching, but for you case, you can consider to run multiple passing through, although it is not very efficient, for example,
string s = "[blue]aaaaaaaaaaaaaaaaaa[blue]bbbbb[/blue]aa[/blue][blue]ccccc";
string sp = @"\[(?<color>[^]]+)\](?<content>.*?)\[/\k<color>\]";
string sr = "<font color=${color}>${content}</font>";
string s2;
do
{
s2 = s;
s = Regex.Replace(s2,sp , sr, RegexOptions.IgnoreCase);
}
while (s2 != s);