Search and Replace Strings in Golang — Top 5 Examples

Go has a powerful standard library that makes string manipulation easy right out of the box.

replace lightbulb

The post Search and Replace Strings in Golang — Top 5 Examples first appeared on Qvault.

Go has a powerful standard library that makes string manipulation easy right out of the box.

One of the functions I use most often is the strings package’s Replace() function. strings.Replace() returns a copy of its input string after searching and replacing all instances of the given substring with a new one.

func Replace(s, old, new string, n int) string

Notes

  • s is the original string that contains parts that need to be changed.
  • old is the substring you want to be replaced.
  • new is the substring that will be swapped out for old.
  • n limits the number of replacements. If you want to replace them all, just set n to -1, or use the more explicit ReplaceAll function.

Let’s say you have some comma-separated-values, CSVs. Perhaps you want to separate each word with a space instead of a comma. This can be useful if you need to make your delimiters consistent so you can later split the string into a slice.

package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Replace("apple,banana,orange,pear", ",", " ", -1))
// prints "apple banana orange pear"
}

It can be useful to only print the replace the first n instances of a word. For example, let’s say we had some text containing dialogue, like in a movie script. If you want to change the delimiter between the speaker and there lines to be a dash instead of a colon, but don’t want to replace any colons in the dialogue, you can set n=1.

package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Replace("Lane: 'The box said price:1'", ":", " -", 1))
// prints "Lane - 'The box said price:1'"
}

Sometimes you just want to strip out certain characters. For example, you may want to remove all periods. You can simply replace all periods with an empty string.

package main

import (
"fmt"
"strings"
)

func main() {
fmt.Println(strings.Replace("123.456.789.0", ".", "", -1))
// prints "1234567890"
}

If you have the same replacements and need to perform those operations on many different documents, it can make sense to initialize a Replacer, which will be much faster when used repeatedly. The reason it’s faster is it builds a trie structure under the hood that it keeps in memory, and that structure can be used repeatedly.

package main

import (
"fmt"
"strings"
)

func main() {
replacer := strings.NewReplacer(",", ":", "!", "?")
fmt.Println(replacer.Replace("hello,there!good,reader!"))
fmt.Println(replacer.Replace("glad,to!have,you!"))
fmt.Println(replacer.Replace("bye,now!thank,you!"))
// prints
// hello:there?good:reader?
// glad:to?have:you?
// bye:now?thank:you?
}

NewReplacer() takes a list of old-new string pairs, so you can use it to perform many different replacement operations.

func NewReplacer(oldnew ...string) *Replacer

We’re shifting packages entirely now, and will be using the standard library’s regexp package. This package exposes a ReplaceAllString() function that lets us do more complicated replacements using a standard regex. This may be useful if you need to do some dynamic replacements, or are really fluent in regular expressions.

func (re *Regexp) ReplaceAllString(src, repl string) stringpackage main

import (
"fmt"
"regexp"
)

func main() {
re := regexp.MustCompile(`r.t`)
fmt.Println(re.ReplaceAllString("rat cat rot dog", "ram"))
// prints "ram cat ram dog"

re = regexp.MustCompile(`-.*-`)
fmt.Println(re.ReplaceAllString("-rasjdkajnsdt-hello world", ""))
// prints "hello world"
}

Thanks for reading, now take a course!

Interested in a high-paying job in tech? Land interviews and pass them with flying colors after taking my hands-on coding courses.

Start coding now

Follow and hit me up on Twitter @q_vault if you have any questions or comments. If I’ve made a mistake in the article be sure to let me know so I can get it corrected!

Subscribe to my newsletter for more coding articles delivered straight to your inbox.

I love Go and Rust, and I like JavaScript and Python. I’m indiehacking on http://qvault.io when my daughter isn’t crying.