var testString = @"SELECT Member.FirstName,Test.LastName,Member.Bann,Test.Register,User.Blog,Member.Cie,User.NoProvince, Province.Title_E AS Province, Country.Title_E AS Country,Member.City,Member.NoCountry,Member.Http,Member.LastAccess FROM Member(NOLOCK) LEFT JOIN Province ON Member.NoProvince=Province.Numero INNER JOIN Country ON Member.NoCountry=Country.Numero WHERE Member.Numero=@Numero"; // Assuming this list doesn't change, make the resulting Regex object static and a singleton List<string> laReservedWord = new List<string>(28); laReservedWord.Add("Order"); laReservedWord.Add("All"); laReservedWord.Add("Table"); laReservedWord.Add("From"); laReservedWord.Add("To"); laReservedWord.Add("Delete"); laReservedWord.Add("Insert"); laReservedWord.Add("Default"); laReservedWord.Add("End"); laReservedWord.Add("Index"); laReservedWord.Add("File"); laReservedWord.Add("Current"); laReservedWord.Add("Expand"); laReservedWord.Add("Image"); laReservedWord.Add("Read"); laReservedWord.Add("View"); laReservedWord.Add("Desc"); laReservedWord.Add("Update"); laReservedWord.Add("User"); laReservedWord.Add("In"); laReservedWord.Add("Public"); laReservedWord.Add("Unique"); laReservedWord.Add("Read"); laReservedWord.Add("Site"); laReservedWord.Add("Full"); laReservedWord.Add("Key"); laReservedWord.Add("Group"); laReservedWord.Add("Like"); // Combinations of beginning delimiter and ending delimiters that are valid for reserved words List< Tuple<string, string>> delimiters = new List< Tuple<string, string>>(); delimiters.Add(new Tuple<string, string>(",", "., )")); delimiters.Add(new Tuple<string, string>(".", ", )=><")); delimiters.Add(new Tuple<string, string>(" ", "., =")); delimiters.Add(new Tuple<string, string>("=", ".")); delimiters.Add(new Tuple<string, string>("(", ".")); var reservedWordPattern = string.Join("|", laReservedWord); var laReservedWordForFieldOnly = new List<string>(1); laReservedWordForFieldOnly.Add("As"); // Combinations of beginning delimiter and ending delimiters that are valid for field only reserved words List< Tuple<string, string>> delimiters2 = new List< Tuple<string, string>>(); delimiters2.Add(new Tuple<string, string>(",", "., )")); delimiters2.Add(new Tuple<string, string>(".", ", )=><")); delimiters2.Add(new Tuple<string, string>(" ", ".,=")); delimiters2.Add(new Tuple<string, string>("=", ".")); delimiters2.Add(new Tuple<string, string>("(", ".")); var reservedWordForFieldPattern = string.Join("|", laReservedWordForFieldOnly); // The expression below will match any of the reserve words that begin with any of the beginning delimiters and ends with any of the end delimiters // (?<=beginDelimiter) is a positive zero width lookbehind for the beginning delimiter. Zero width prevents it from being included as part of the match // (lcWordList) matches any of the words in the reserved word list. The | that separates the words acts as an OR. The parenthesis also make it a matching group. // (?=[endDelimiters]) is a positive zero width lookahead for the end delimiter. // "[${KeyWord}]" as the replacement substitutes the matched keyword with the match surrounded by brackets. var matchPatternByDelimiter = delimiters.Select(tup => string.Format("((?<={0})({1})(?=[{2}]))", Regex.Escape(tup.Item1), reservedWordPattern, Regex.Escape(tup.Item2))) .Union(delimiters2.Select(tup => string.Format("((?<={0})({1})(?=[{2}]))", Regex.Escape(tup.Item1), reservedWordForFieldPattern, Regex.Escape(tup.Item2)))); var regexPattern = string.Format("(?< KeyWord>{0})", string.Join("|", matchPatternByDelimiter)); var regex = new Regex(regexPattern, RegexOptions.Compiled | RegexOptions.IgnoreCase); var retVal = regex.Replace(testString, "[${KeyWord}]"); Console.WriteLine(retVal);