Regex › Go Regex for Security Tooling

Go regex and the RE2 guarantee

3 min read Intermediate 3 sections

Go is the language of modern security tools, and its regexp package uses the RE2 engine. RE2 makes a trade that matters for tooling: it drops a couple of features in exchange for a guarantee that no pattern can ever blow up. This lesson is why that matters and how Go regex differs.

You'll learn to

  • Understand RE2's linear-time guarantee
  • Know what RE2 gives up
  • See why tooling chooses it

The RE2 trade

RE2 guarantees linear-time matching: a pattern’s runtime is bounded by the input length, always. No input can ever cause catastrophic backtracking. In exchange, RE2 drops backreferences and lookarounds — features that require backtracking.

package main
import ("fmt"; "regexp")

func main() {
    re := regexp.MustCompile(`AKIA[0-9A-Z]{16}`)
    matches := re.FindAllString(text, -1)
    fmt.Println(matches)
}

The API is straightforward: MustCompile builds the pattern, FindAllString extracts matches. The syntax is familiar; what’s different is the guarantee underneath it.

Why tooling chooses RE2

Checkpoint

What does RE2 (Go's regex engine) guarantee, and what does it give up to achieve it?

Try it yourself

Explain why a Go-based secret scanner running thousands of patterns over millions of files benefits from RE2’s guarantee. Then name the two regex features you’d lose moving a pattern from PCRE to Go, and what you’d do if a pattern relied on them.

Key takeaways

  • RE2 guarantees linear-time matching — no catastrophic backtracking ever.
  • It drops backreferences and lookarounds to achieve that.
  • Go’s regexp uses RE2; MustCompile plus FindAllString is the common API.
  • Tooling chooses RE2 for predictable performance at scale (no self-ReDoS).

Quick quiz

Next, Node.js regex — backend JavaScript patterns for API analysis and tooling.

Was this lesson helpful?