Today, I'll show you how to do a case-insensitive string replace in Go.

By default, string replacement in Go is case-sensitive, but sometimes, that's not the desired behaviour.

The best way to tackle this problem is to use the regexp (regular expressions) package to do this.

You can do it with a simple function like this:

import (
    "regexp"
)

func CaseInsensitiveReplace(subject string, search string, replace string) string {
    searchRegex := regexp.MustCompile("(?i)" + search)
    return searchRegex.ReplaceAllString(subject, replace)
}

The trick is in the regular expression pattern. The modifier i tells it to be case-insensitive.

This works flawlessly, however, there is one caveat: performance.

To give you an idea about the performance penalty, I wrote a simple benchmark:

import (
    "testing"
)

func Benchmark_CaseInsensitiveReplace(b *testing.B) {
    for n := 0; n < b.N; n++ {
        twxstring.CaseInsensitiveReplace("{Title}|{Title}", "{title}", "My Title")
    }
}

func Benchmark_CaseSensitiveReplace(b *testing.B) {
    for n := 0; n < b.N; n++ {
        strings.ReplaceAll("{Title}|{Title}", "{Title}", "My Title")
    }
}

The results are pretty self-explanatory:

Benchmark_CaseInsensitiveReplace-4         420237          3384 ns/op        2119 B/op          24 allocs/op
Benchmark_CaseSensitiveReplace-4          8224800           190 ns/op          64 B/op           2 allocs/op