ZetCode

Golang Regexp.Find

最后修改于 2025 年 4 月 20 日

本教程解释了如何在 Go 中使用 Regexp.Find 方法。我们将介绍基本的模式匹配并提供实际示例。

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

Regexp.Find 方法返回一个切片,其中包含字节切片中最左边匹配项的文本。如果未找到匹配项,则返回 nil。

基本的 Regexp.Find 示例

Regexp.Find 最简单的用法是在字节切片中查找第一个匹配项。在这里,我们搜索一个简单的单词模式。

basic_find.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`foo`)
    text := []byte("some foo bar foo baz")
    
    match := re.Find(text)
    fmt.Printf("Found: %q\n", match) // "foo"
}

该方法返回字节切片中“foo”的第一个出现。结果是一个包含匹配文本的字节切片。

在字符串中查找数字

此示例演示了在字符串中查找第一个数字序列。我们将字符串转换为字节切片进行搜索。

find_digits.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\d+`)
    text := []byte("Order 12345 was placed on 2025-04-20")
    
    match := re.Find(text)
    if match != nil {
        fmt.Printf("First number found: %s\n", match) // "12345"
    } else {
        fmt.Println("No numbers found")
    }
}

模式 \d+ 匹配一个或多个数字。该方法返回在输入中找到的第一个数字序列。

不区分大小写的匹配

此示例展示了如何使用 Find 执行不区分大小写的匹配。我们在模式中使用 (?i) 标志修饰符。

case_insensitive.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`(?i)hello`)
    text := []byte("HeLLo World, hElLo Go")
    
    match := re.Find(text)
    fmt.Printf("Found: %q\n", match) // "HeLLo"
}

(?i) 使模式不区分大小写。该方法返回第一个匹配项,忽略大小写。

查找单词边界

此示例演示了使用单词边界查找整个单词。\b 元字符匹配单词边界。

word_boundaries.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`\bGo\b`)
    text := []byte("Golang Go programming in Go")
    
    match := re.Find(text)
    fmt.Printf("Found: %q\n", match) // "Go"
}

该模式仅在“Go”作为整个单词出现时才匹配。它不会匹配“Golang”中的“Go”。

查找 HTML 标签

此示例展示了如何在文档中查找 HTML 标签。我们使用一个简单的模式来匹配标签名称。

html_tags.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`<[a-zA-Z]+>`)
    text := []byte("<html><head><title>Page</title></head>")
    
    match := re.Find(text)
    fmt.Printf("First tag found: %s\n", match) // "<html>"
}

该模式匹配打开的 HTML 标签。请注意,这是一个简化的示例,不能处理所有 HTML 标签情况。

查找电子邮件地址

此示例演示了在文本中查找电子邮件地址。我们使用基本的电子邮件模式进行演示。

find_email.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}`)
    text := []byte("Contact us at info@example.com or support@domain.org")
    
    match := re.Find(text)
    fmt.Printf("First email found: %s\n", match) // "info@example.com"
}

该模式匹配常见的电子邮件格式。该方法返回在文本中找到的第一个电子邮件地址。

查找 URL

此示例展示了如何在文本中查找 URL。我们使用一个简单的模式来匹配常见的 URL 格式。

find_urls.go
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile(`https?://[^\s]+`)
    text := []byte("Visit https://example.com or http://test.org for more info")
    
    match := re.Find(text)
    fmt.Printf("First URL found: %s\n", match) // "https://example.com"
}

该模式匹配以 http:// 或 https:// 开头的 URL。该方法返回在输入文本中找到的第一个 URL。

来源

Go regexp 包文档

本教程通过字节切片中的模式匹配实际示例,介绍了 Go 中的 Regexp.Find 方法。

作者

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

列出所有 Go 教程