Go语言正则表达式:完整解析与示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

Go语言正则表达式实战示例

\n\n

正则表达式(regexp)是一种强大的工具,用于按模式搜索、提取和替换文本。在Go(Golang)中,通过标准包regexp实现正则表达式的处理。本文将介绍主要函数、语法,并提供实用示例,帮助您在项目中自信地使用正则表达式。

\n\n

regexp包基础

\n\n

regexp包提供了两种编译正则表达式的主要方式:

\n\n
    \n
  • regexp.Compile(pattern string) (*Regexp, error) — 编译模式并返回Regexp对象,如果模式无效则返回错误。
  • \n
  • regexp.MustCompile(pattern string) *Regexp — 功能相同,但在出错时会触发panic。适用于在初始化阶段定义的静态模式。
  • \n
\n\n

建议对保证正确的模式(例如代码中硬编码的模式)使用MustCompile,对来自用户或外部源的动态模式使用Compile。

\n\n

示例1:查找子字符串(FindString)

\n\n

FindString函数返回与模式匹配的第一个子字符串。如果没有匹配项,则返回空字符串。

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "我的邮箱: example@mail.com, 备用: test@example.org"\n    pattern := `[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}`\n\n    re := regexp.MustCompile(pattern)\n    match := re.FindString(text)\n\n    fmt.Println("找到的邮箱:", match) // 输出: example@mail.com\n}
\n\n

示例2:查找所有匹配项(FindAllString)

\n\n

如果需要查找所有匹配项,请使用FindAllString。第二个参数是最大匹配数(-1表示全部)。

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "代码: ABC-123, XYZ-456, QWE-789"\n    pattern := `[A-Z]{3}-\\d{3}`\n\n    re := regexp.MustCompile(pattern)\n    matches := re.FindAllString(text, -1)\n\n    fmt.Println("找到的代码:", matches)\n    // 输出: [ABC-123 XYZ-456 QWE-789]\n}
\n\n

示例3:替换文本(ReplaceAllString)

\n\n

ReplaceAllString将所有匹配的模式替换为指定的字符串。可以使用$1、$2等语法引用捕获组。

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    text := "日期: 2024-01-15, 另一个日期: 2023-12-31"\n    pattern := `(\\d{4})-(\\d{2})-(\\d{2})`\n\n    re := regexp.MustCompile(pattern)\n    // 将格式从YYYY-MM-DD改为DD.MM.YYYY\n    result := re.ReplaceAllString(text, "$3.$2.$1")\n\n    fmt.Println("结果:", result)\n    // 输出: 日期: 15.01.2024, 另一个日期: 31.12.2023\n}
\n\n

示例4:检查字符串是否匹配模式(MatchString)

\n\n

MatchString函数在字符串中至少有一个模式匹配时返回true。

\n\n
package main\n\nimport (\n    "fmt"\n    "regexp"\n)\n\nfunc main() {\n    emails := []string{"user@example.com", "invalid-email", "admin@site.org"}\n    pattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$`\n\n    re := regexp.MustCompile(pattern)\n    for _, email := range emails {\n        if re.MatchString(email) {\n            fmt.Printf("'%s' — 有效的邮箱\\n", email)\n        } else {\n            fmt.Printf("'%s' — 无效的邮箱\\n", email)\n        }\n    }\n    // 输出:\n    // 'user@example.com' — 有效的邮箱\n    // 'invalid-email' — 无效的邮箱\n    // 'admin@site.org' — 有效的邮箱\n}
\n\n

示例5:使用捕获组提取数据(FindStringSubmatch)

\n\n

FindString

博客

书籍推荐