Вы изменяете цвет консоли внутри делегата с уже сформированной строкой. Как вариант, можно разделить текст на слова и выводить нужные слова с нужным цветом:
using System;
using System.Text.RegularExpressions;
public class Example
{
public static void Main(string[] args)
{
string text = "This is the great city of Sevsar, the harbor of humanity";
string[] keywords = { "great", "harbor" };
HighlightKeywords(text, keywords, ConsoleColor.Red);
Console.WriteLine();
}
public static void HighlightKeywords(string text, string[] keywords, ConsoleColor highlightColor)
{
string pattern = $@"\b({string.Join("|", keywords)})\b";
MatchCollection matches = Regex.Matches(text, pattern, RegexOptions.IgnoreCase);
int lastIndex = 0;
foreach (Match match in matches)
{
Console.Write(text.Substring(lastIndex, match.Index - lastIndex));
Console.ForegroundColor = highlightColor;
Console.Write(match.Value);
Console.ResetColor();
lastIndex = match.Index + match.Length;
}
Console.Write(text.Substring(lastIndex));
}
}