0Pricing
Go Academy · 课时

regexp 基础

编译并匹配模式

regexp 基础 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。

什么是正则表达式

正则表达式(regexp)是一种描述字符串集合的模式。Go 通过 regexp 软件包提供正则表达式。

它们非常适合验证和搜索文本。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    matched, _ := regexp.MatchString("go+", "gooo")
    fmt.Println(matched)
}

使用 MatchString 快速匹配

regexp.MatchString(pattern, s) 会报告模式是否出现在 s 的任意位置。它返回一个布尔值和一个错误。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    ok, _ := regexp.MatchString("cat", "the cat sat")
    fmt.Println(ok)
}

编译模式

如果需要重复使用,请使用 regexp.Compile 编译一次。它会返回一个可重复使用的 *regexp.Regexp,如果模式无效则返回错误。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re, err := regexp.Compile("[0-9]+")
    fmt.Println(re.MatchString("abc123"), err)
}

使用 MustCompile 处理常量

如果模式无效,regexp.MustCompile 会引发恐慌。请将它用于编译时已知的固定模式,通常是软件包级变量。

package main

import (
    "fmt"
    "regexp"
)

var digits = regexp.MustCompile("[0-9]+")

func main() {
    fmt.Println(digits.MatchString("order 42"))
}

字符类

方括号定义允许使用的字符集合。[aeiou] 可匹配任意元音;[a-z] 等范围可匹配一个字符区间。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[a-z]+")
    fmt.Println(re.MatchString("Hello"))
}

预定义字符类

快捷方式让常见集合更易使用:\d 表示一个数字,\w 表示一个单词字符,\s 表示空白字符。在 Go 字符串中,请转义反斜杠。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("\\d+")
    fmt.Println(re.MatchString("abc 99"))
}

量词

量词表示重复次数:

  • * 表示零次或多次,
  • + 表示一次或多次,
  • ? 表示零次或一次,
  • {2,4} 表示一个范围。
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("a{2,3}")
    fmt.Println(re.MatchString("aaa"))
    fmt.Println(re.MatchString("a"))
}

锚点

锚点会固定匹配位置:^ 表示文本开头,$ 表示文本结尾。将二者结合使用可要求整个字符串都匹配。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("^go$")
    fmt.Println(re.MatchString("go"))
    fmt.Println(re.MatchString("going"))
}

交替与分组

竖线 | 表示 OR,括号用于将各个部分组合在一起。(cat|dog)s? 可以匹配 cat、cats、dog 或 dogs。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("(cat|dog)s?")
    fmt.Println(re.MatchString("dogs"))
}

验证格式

带锚点的模式可以用于验证器。这里将检查一种简单的 ZIP 样式代码:只能包含数字,且必须正好包含五位数字。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("^\\d{5}$")
    fmt.Println(re.MatchString("12345"))
    fmt.Println(re.MatchString("123"))
}

匹配字节

方法有字符串形式和字节切片形式。Match 作用于 []byte,功能对应于 MatchString。

package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("[0-9]+")
    fmt.Println(re.Match([]byte("id7")))
}

快速检查

哪个函数在模式无效时会引发恐慌,并且最适合固定模式?

回顾:正则表达式基础

您已经学习了基础知识:

  • 使用 MatchString 快速匹配;使用 Compile 或 MustCompile 编译。
  • 使用字符类、量词、锚点和分组构建模式。
  • 使用 ^ 和 $ 设置锚点,以验证整个字符串。
package main

import (
    "fmt"
    "regexp"
)

func main() {
    re := regexp.MustCompile("^[a-z]+@[a-z]+$")
    fmt.Println(re.MatchString("hi@host"))
}

常见问题解答

「regexp 基础」课时是免费的吗?

是的 — 「regexp 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。

「regexp 基础」这节课中我会学到什么?

编译并匹配模式 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Go Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「regexp 基础」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Go Academy 课中编写并运行代码吗?

能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. regexp 基础
  2. 查找与提取
  3. 替换文本
  4. 性能技巧
← 返回 Go Academy