Go语言正则表达式实战示例
\n\n正则表达式(regexp)是一种强大的工具,用于按模式搜索、提取和替换文本。在Go(Golang)中,通过标准包regexp实现正则表达式的处理。本文将介绍主要函数、语法,并提供实用示例,帮助您在项目中自信地使用正则表达式。
regexp包基础
\n\nregexp包提供了两种编译正则表达式的主要方式:
- \n
regexp.Compile(pattern string) (*Regexp, error)— 编译模式并返回Regexp对象,如果模式无效则返回错误。 \n regexp.MustCompile(pattern string) *Regexp— 功能相同,但在出错时会触发panic。适用于在初始化阶段定义的静态模式。 \n
建议对保证正确的模式(例如代码中硬编码的模式)使用MustCompile,对来自用户或外部源的动态模式使用Compile。
示例1:查找子字符串(FindString)
\n\nFindString函数返回与模式匹配的第一个子字符串。如果没有匹配项,则返回空字符串。
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表示全部)。
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\nReplaceAllString将所有匹配的模式替换为指定的字符串。可以使用$1、$2等语法引用捕获组。
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\nMatchString函数在字符串中至少有一个模式匹配时返回true。
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\nFindString