ZetCode

Golang Regexp.FindAllString

最后修改于 2025 年 4 月 20 日

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

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

Regexp.FindAllString 方法返回字符串中正则表达式的所有连续匹配项。它对于提取多个模式非常有用。

基本 FindAllString 示例

FindAllString 最简单的用法是查找单词的所有出现。在这里,我们在字符串中查找所有“go”的实例。

basic_findall.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`go`)
    text := "go run go build go test go fmt"
    
    matches := re.FindAllString(text, -1)
    fmt.Println(matches) // [go go go go]
    fmt.Println("Found", len(matches), "matches")
}

该方法返回所有非重叠匹配项的切片。-1 表示查找所有匹配项。我们可以使用正数来限制匹配项的数量。

查找所有电子邮件地址

此示例演示了如何使用 FindAllString 在文本中查找所有电子邮件地址。

find_emails.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    pattern := `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}`
    re := regexp.MustCompile(pattern)
    text := `Contact us at info@example.com or support@company.co.uk 
             for assistance. Invalid emails: user@, @domain.com`
    
    emails := re.FindAllString(text, -1)
    for i, email := range emails {
        fmt.Printf("%d: %s\n", i+1, email)
    }
}

该模式匹配标准的电子邮件格式。FindAllString 会提取所有有效的电子邮件,同时忽略无效的电子邮件。

限制匹配数量

我们可以限制 FindAllString 返回的匹配项数量。此示例仅查找字符串中的前两个数字。

limit_matches.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\d+`)
    text := "There are 123 apples and 456 oranges, 789 bananas"
    
    // Find first 2 number matches
    matches := re.FindAllString(text, 2)
    fmt.Println(matches) // [123 456]
}

第二个参数控制返回多少个匹配项。在这里,我们只获取文本中找到的前两个数字。

查找特定长度的单词

此示例使用 FindAllString 在字符串中查找所有 5 个字母的单词。

word_length.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\b\w{5}\b`)
    text := "The quick brown fox jumps over the lazy dog"
    
    fiveLetterWords := re.FindAllString(text, -1)
    fmt.Println(fiveLetterWords) // [quick brown jumps]
}

模式 \b\w{5}\b 精确匹配 5 个字母的单词。单词边界可确保我们仅匹配完整的单词。

查找 HTML 标签

此示例从字符串中提取所有 HTML 标签,使用 FindAllString

html_tags.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`<[^>]+>`)
    html := `<div><p>Hello</p><a href="#">Link</a></div>`
    
    tags := re.FindAllString(html, -1)
    for _, tag := range tags {
        fmt.Println(tag)
    }
}

该模式匹配尖括号之间的任何内容。请注意,这是一个简单的示例,可能无法处理所有 HTML 边缘情况。

查找所有首字母大写的单词

此示例使用 FindAllString 查找所有以大写字母开头的单词。

capitalized_words.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\b[A-Z][a-z]*\b`)
    text := "The Quick Brown Fox jumps Over The Lazy Dog"
    
    capitalized := re.FindAllString(text, -1)
    fmt.Println(capitalized) // [The Quick Brown Fox Over The Lazy Dog]
}

该模式匹配单词边界,后跟一个大写字母和可选的小写字母。它会查找专有名词和句子开头。

查找所有标签

此示例从社交媒体帖子中提取所有标签,使用 FindAllString

hashtags.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`#\w+`)
    post := `Just launched our #newproduct! Check it out #golang #programming 
             #tech #innovation`
    
    hashtags := re.FindAllString(post, -1)
    fmt.Println(hashtags) // [#newproduct #golang #programming #tech #innovation]
}

该模式匹配 # 符号后跟一个或多个单词字符。FindAllString 会收集文本中的所有标签。

来源

Go regexp 包文档

本教程通过查找字符串中多个模式匹配的实际示例,涵盖了 Go 中的 Regexp.FindAllString 方法。

作者

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

列出所有 Go 教程