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);Beautiful. One problem - the space before KeyWord here needs to be removed before it will run:
var regexPattern = string.Format("(?< KeyWord>{0})", string.Join("|", matchPatternByDelimiter));I'm guessing you had to include it so that the UT pre would work ?