Golang Regexp.FindAllString
最后修改于 2025 年 4 月 20 日
本教程将解释如何在 Go 中使用 Regexp.FindAllString 方法。我们将涵盖正则表达式基础知识并提供实际示例。
一个 正则表达式 是一个定义搜索模式的字符序列。它用于在字符串中进行模式匹配。
Regexp.FindAllString 方法返回字符串中正则表达式的所有连续匹配项。它对于提取多个模式非常有用。
基本 FindAllString 示例
FindAllString 最简单的用法是查找单词的所有出现。在这里,我们在字符串中查找所有“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 在文本中查找所有电子邮件地址。
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 返回的匹配项数量。此示例仅查找字符串中的前两个数字。
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 个字母的单词。
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。
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 查找所有以大写字母开头的单词。
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。
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.FindAllString 方法。