ZetCode

Golang Regexp.ReplaceAllStringFunc

最后修改于 2025 年 4 月 20 日

本教程将解释如何在 Go 中使用 Regexp.ReplaceAllStringFunc 方法。我们将介绍使用正则表达式的高级字符串替换。

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

Regexp.ReplaceAllStringFunc 方法使用自定义函数替换正则表达式模式的所有匹配项。这允许动态替换。

基本的 ReplaceAllStringFunc 示例

ReplaceAllStringFunc 最简单的用法是将匹配的文本转换为大写。在这里,我们将所有 "go" 的出现都大写。

basic_replace.go
package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile(`go`)
    text := "Let's go to the Go conference and learn Go!"
    
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        return strings.ToUpper(match)
    })
    
    fmt.Println(result)
}

该函数匹配 "go"(区分大小写)并应用转换。输出显示所有匹配项都已转换为大写。

条件替换

我们可以在替换函数中使用条件。此示例将大于 5 的数字替换为其对应的单词。

conditional_replace.go
package main

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

func main() {
    re := regexp.MustCompile(`\d+`)
    text := "I have 3 apples, 7 oranges, and 10 bananas"
    
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        num, _ := strconv.Atoi(match)
        if num > 5 {
            return "many"
        }
        return match
    })
    
    fmt.Println(result)
}

正则表达式匹配所有数字序列。该函数将它们转换为整数并应用条件逻辑。只有大于 5 的数字才会被替换。

复杂转换

ReplaceAllStringFunc 可以执行复杂的转换。在这里,我们将日期从 MM/DD/YYYY 格式化为 YYYY-MM-DD。

date_transform.go
package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile(`(\d{2})/(\d{2})/(\d{4})`)
    text := "Start date: 04/20/2025, End date: 12/31/2025"
    
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        parts := strings.Split(match, "/")
        return fmt.Sprintf("%s-%s-%s", parts[2], parts[0], parts[1])
    })
    
    fmt.Println(result)
}

该模式捕获日期组件。该函数分割匹配项并重新排列部分。这展示了如何解析和重新格式化匹配的文本。

动态内容生成

我们可以动态生成替换内容。此示例扩展了文本中的缩写。

abbrev_expand.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\b[A-Z]{2,}\b`)
    text := "The WHO declared COVID a PHEIC in JAN 2020"
    
    abbrevs := map[string]string{
        "WHO": "World Health Organization",
        "PHEIC": "Public Health Emergency of International Concern",
        "JAN": "January",
    }
    
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        if expansion, ok := abbrevs[match]; ok {
            return expansion
        }
        return match
    })
    
    fmt.Println(result)
}

正则表达式匹配 2 个或更多字母的大写单词。该函数在映射表中查找匹配项,并在找到时返回展开后的内容。未匹配的缩写保持不变。

转义特殊字符

此示例演示了如何转义匹配文本中的 HTML 特殊字符。它展示了替换函数的与安全相关的用法。

html_escape.go
package main

import (
    "fmt"
    "html"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`<.*?>`)
    text := "Alert: <script>alert('xss')</script> detected"
    
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        return html.EscapeString(match)
    })
    
    fmt.Println(result)
}

该模式匹配 HTML/XML 标签。该函数转义匹配项中的所有特殊字符。这可以防止 Web 应用程序中潜在的 XSS 攻击。

多步处理

替换函数可以执行多个处理步骤。在这里,我们清理和标准化产品代码。

product_code.go
package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile(`[A-Z]{2}\d{3}[a-z]?`)
    text := "Product codes: AB123, CD456x, EF789, GH101 invalid"
    
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        // Convert to uppercase
        code := strings.ToUpper(match)
        // Pad with zeros if needed
        if len(code) == 5 {
            return code[:2] + "0" + code[2:]
        }
        return code
    })
    
    fmt.Println(result)
}

正则表达式匹配产品代码模式。该函数标准化大小写和格式。这展示了如何同时实现验证和规范化。

性能优化

对于复杂的替换,我们可以通过一次性编译正则表达式来优化。此示例展示了高效的多模式替换。

optimized_replace.go
package main

import (
    "fmt"
    "regexp"
    "strings"
)

func main() {
    re := regexp.MustCompile(`\b(one|two|three)\b`)
    text := "Count: one, two, three, four, five"
    
    replacements := map[string]string{
        "one": "1",
        "two": "2",
        "three": "3",
    }
    
    result := re.ReplaceAllStringFunc(text, func(match string) string {
        return replacements[match]
    })
    
    fmt.Println(result)
}

正则表达式匹配数字单词。该函数使用映射表进行快速查找。此模式对于许多替换规则都非常高效。

来源

Go regexp.ReplaceAllStringFunc 文档

本教程通过使用实际示例介绍了 Go 中的 Regexp.ReplaceAllStringFunc 方法,演示了高级字符串替换。

作者

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

列出所有 Go 教程