Golang regexp.QuoteMeta
last modified April 20, 2025
This tutorial explains how to use the regexp.QuoteMeta function in Go.
We'll cover its purpose and provide practical examples of escaping regex metacharacters.
A regular expression is a sequence of characters that defines a
search pattern. Special characters like ., *, and +
have special meanings in regex patterns.
The regexp.QuoteMeta function escapes all regular expression metacharacters in a string. The returned string is a regular expression that matches the literal text.
Basic regexp.QuoteMeta Example
The simplest use of regexp.QuoteMeta escapes a string containing
regex metacharacters. This makes them match literally.
package main
import (
"fmt"
"regexp"
)
func main() {
str := `Hello. there!*`
quoted := regexp.QuoteMeta(str)
fmt.Println("Original:", str)
fmt.Println("Quoted:", quoted)
re := regexp.MustCompile(quoted)
fmt.Println("Match:", re.MatchString("Hello. there!*"))
}
The function escapes the . and * characters. The
compiled regex will match the literal string "Hello. there!*".
Escaping User Input
When building regex patterns from user input, always use QuoteMeta.
This prevents regex injection attacks.
package main
import (
"fmt"
"regexp"
)
func main() {
userInput := `file*.txt`
safePattern := regexp.QuoteMeta(userInput) + `$`
re := regexp.MustCompile(safePattern)
fmt.Println("Match file.txt:", re.MatchString("file.txt"))
fmt.Println("Match file1.txt:", re.MatchString("file1.txt"))
fmt.Println("Match file*.txt:", re.MatchString("file*.txt"))
}
Without quoting, the pattern would match any file ending with ".txt". After quoting, it only matches the literal "file*.txt".
Escaping Path Separators
File paths often contain characters that are regex metacharacters. This example shows how to safely match paths.
package main
import (
"fmt"
"regexp"
)
func main() {
path := `/usr/local/bin/go`
quotedPath := regexp.QuoteMeta(path)
re := regexp.MustCompile(quotedPath)
fmt.Println("Match exact path:", re.MatchString(path))
fmt.Println("Match similar path:", re.MatchString("/usr/local/bin/golang"))
}
The forward slashes are escaped, ensuring the regex matches the exact path string. Without quoting, the slashes would be interpreted as regex delimiters.
Combining with Other Patterns
QuoteMeta can be combined with other regex patterns. Here we create
a pattern that matches a literal prefix.
package main
import (
"fmt"
"regexp"
)
func main() {
prefix := `user[input]`
suffix := `_\d+`
pattern := regexp.QuoteMeta(prefix) + suffix
re := regexp.MustCompile(pattern)
tests := []string{
"user[input]_123",
"user_input_456",
"user[input]X789",
}
for _, test := range tests {
fmt.Printf("%s: %t\n", test, re.MatchString(test))
}
}
The square brackets in the prefix are escaped, while the suffix uses regex metacharacters. Only strings matching both parts will match.
Escaping for Replacement Strings
When using regex replacement, QuoteMeta ensures literal replacement.
This example demonstrates safe string substitution.
package main
import (
"fmt"
"regexp"
)
func main() {
text := "Replace $10 with $$10"
pattern := `\$\d+`
replacement := regexp.QuoteMeta("$$20")
re := regexp.MustCompile(pattern)
result := re.ReplaceAllString(text, replacement)
fmt.Println("Original:", text)
fmt.Println("Replaced:", result)
}
The replacement string contains a dollar sign, which normally has special meaning. Quoting ensures it's treated as a literal dollar sign.
Performance Comparison
This example compares matching with and without QuoteMeta to show
the importance of proper escaping.
package main
import (
"fmt"
"regexp"
)
func main() {
search := `file[1].txt`
// Unsafe match (might not work as expected)
unsafeRe := regexp.MustCompile(search)
fmt.Println("Unsafe match:", unsafeRe.MatchString(search))
// Safe match with QuoteMeta
safeRe := regexp.MustCompile(regexp.QuoteMeta(search))
fmt.Println("Safe match:", safeRe.MatchString(search))
// What happens with special characters
testInput := "file1txt"
fmt.Println("Unsafe match wrong input:", unsafeRe.MatchString(testInput))
fmt.Println("Safe match wrong input:", safeRe.MatchString(testInput))
}
The unquoted pattern matches unexpected inputs because square brackets are regex metacharacters. The quoted pattern matches only the exact literal string.
Escaping Complex Strings
This example shows how QuoteMeta handles strings with multiple
special characters.
package main
import (
"fmt"
"regexp"
)
func main() {
complexStr := `^$.*+?()|[]{}-\`
quoted := regexp.QuoteMeta(complexStr)
fmt.Println("Original:", complexStr)
fmt.Println("Quoted:", quoted)
re := regexp.MustCompile(quoted)
fmt.Println("Match original:", re.MatchString(complexStr))
fmt.Println("Match modified:", re.MatchString("^$X.*+?()|[]{}-\\"))
}
All special regex metacharacters are properly escaped. The compiled pattern will only match the exact original string with all special characters.
Source
Go regexp.QuoteMeta documentation
This tutorial covered the regexp.QuoteMeta function in Go with
practical examples of escaping regex metacharacters in strings.
Author
List all Go tutorials.