ZetCode

Golang Regexp.ReplaceAllString

最后修改于 2025 年 4 月 20 日

本教程讲解如何在 Go 中使用 Regexp.ReplaceAllString 方法。我们将涵盖正则表达式替换基础知识并提供实际示例。

一个 正则表达式 是一个定义搜索模式的字符序列。它用于在字符串中进行模式匹配。

Regexp.ReplaceAllString 方法将字符串中正则表达式模式的所有匹配项替换为指定的替换字符串。

基本 ReplaceAllString 示例

ReplaceAllString 最简单的用法是替换模式的所有出现。这里我们将所有数字替换为星号。

basic_replace.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\d`)
    original := "Order 12345 was placed on 2023-04-20"
    replaced := re.ReplaceAllString(original, "*")
    
    fmt.Println("Original:", original)
    fmt.Println("Replaced:", replaced)
}

该模式匹配任何数字字符。ReplaceAllString 将每个数字替换为星号。该方法会扫描整个输入字符串。

使用捕获组进行替换

我们可以在替换字符串中使用捕获组。此示例重新格式化日期。

group_replace.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
    original := "Event date: 2023-04-20"
    replaced := re.ReplaceAllString(original, "$2/$3/$1")
    
    fmt.Println("Original:", original)
    fmt.Println("Replaced:", replaced)
}

该模式捕获年、月、日组。替换字符串使用 $1、$2、$3 引用将它们重新排列为 MM/DD/YYYY 格式。

不区分大小写的替换

使用 (?i) 标志时,ReplaceAllString 可以执行不区分大小写的替换。这会替换所有颜色拼写。

case_insensitive.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(?i)colour`)
    original := "Colour, colour, COLOR, coloUr"
    replaced := re.ReplaceAllString(original, "color")
    
    fmt.Println("Original:", original)
    fmt.Println("Replaced:", replaced)
}

(?i) 标志使匹配不区分大小写。所有“colour”的变体都将被替换为美式拼写“color”。

使用空字符串移除文本

将空字符串作为替换传递会有效地移除匹配的模式。这会从字符串中移除所有 HTML 标签。

remove_tags.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`<[^>]+>`)
    original := "<h1>Title</h1><p>Paragraph</p>"
    replaced := re.ReplaceAllString(original, "")
    
    fmt.Println("Original:", original)
    fmt.Println("Replaced:", replaced)
}

该模式匹配尖括号之间的任何文本。空的替换字符串会移除所有 HTML 标签,同时保留它们之间的内容。

替换多个模式

对于复杂的替换,我们可以链式调用多个 ReplaceAllString。这可以规范化字符串中的空格。

multiple_replace.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    original := "   Too    many    spaces    here.   "
    
    // Replace multiple spaces with single space
    re1 := regexp.MustCompile(`\s+`)
    step1 := re1.ReplaceAllString(original, " ")
    
    // Trim leading/trailing spaces
    re2 := regexp.MustCompile(`^\s|\s$`)
    final := re2.ReplaceAllString(step1, "")
    
    fmt.Println("Original:", original)
    fmt.Println("Final:", final)
}

第一个替换会压缩多个空格字符。第二个替换会移除前导和尾随空格。这会产生干净、规范化的文本。

使用替换函数

对于动态替换,我们可以使用 ReplaceAllStringFunc。此示例将温度从华氏度转换为摄氏度。

function_replace.go
package main

import (
    "fmt"
    "regexp"
    "strconv"
)

func main() {
    re := regexp.MustCompile(`(\d+)°F`)
    original := "Temperatures: 32°F, 68°F, 100°F"
    
    replaced := re.ReplaceAllStringFunc(original, func(match string) string {
        f, _ := strconv.Atoi(re.FindStringSubmatch(match)[1])
        c := (f - 32) * 5 / 9
        return fmt.Sprintf("%d°C", c)
    })
    
    fmt.Println("Original:", original)
    fmt.Println("Replaced:", replaced)
}

该模式匹配华氏温度。对于每次匹配,该函数会将值转换为摄氏度。这展示了动态替换功能。

转义特殊字符

当使用包含特殊正则表达式字符的文字字符串进行替换时,我们必须对其进行转义。此示例安全地替换金额。

escape_replace.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\$\d+`)
    original := "Prices: $10, $20, $30"
    replacement := regexp.QuoteMeta("[REDACTED]")
    
    replaced := re.ReplaceAllString(original, replacement)
    fmt.Println("Original:", original)
    fmt.Println("Replaced:", replaced)
}

regexp.QuoteMeta 会转义替换字符串中的特殊字符。这确保替换被视为文字文本,而不是模式。

来源

Go regexp 包文档

本教程通过文本替换和操作的实际示例,涵盖了 Go 中的 Regexp.ReplaceAllString 方法。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 Go 教程