Search code examples
c#stringreplaceignore-case

How to ignore case in String.replace


string sentence = "We know it contains 'camel' word.";
// Camel can be in different cases:
string s1 = "CAMEL";
string s2 = "CaMEL";
string s3 = "CAMeL";
// ...
string s4 = "Camel";
// ...
string s5 = "camel";

How to replace 'camel' in sentence with 'horse' despite of string.Replace doesn't support ignoreCase on left string?


Solution

  • Use a regular expression:

    var regex = new Regex( "camel", RegexOptions.IgnoreCase );
    var newSentence = regex.Replace( sentence, "horse" );
    

    Of course, this will also match words containing camel, but it's not clear if you want that or not.

    If you need exact matches you can use a custom MatchEvaluator.

    public static class Evaluators
    {
        public static string Wrap( Match m, string original, string format )
        {
            // doesn't match the entire string, otherwise it is a match
            if (m.Length != original.Length)
            {
                // has a preceding letter or digit (i.e., not a real match).
                if (m.Index != 0 && char.IsLetterOrDigit( original[m.Index - 1] ))
                {
                    return m.Value;
                }
                // has a trailing letter or digit (i.e., not a real match).
                if (m.Index + m.Length != original.Length && char.IsLetterOrDigit( original[m.Index + m.Length] ))
                {
                    return m.Value;
                }
            }
            // it is a match, apply the format
            return string.Format( format, m.Value );
        }
    } 
    

    Used with the previous example to wrap the match in a span as:

    var regex = new Regex( highlightedWord, RegexOptions.IgnoreCase );
    foreach (var sentence in sentences)
    {
        var evaluator = new MatchEvaluator( match => Evaluators.Wrap( match, sentence, "<span class='red'>{0}</span>" ) );
        Console.WriteLine( regex.Replace( sentence, evaluator ) );
    }