Go语言正则表达式实战示例
正则表达式(regex)是一种强大的工具,用于根据模式搜索、提取和替换文本。在Go语言(Golang)中,使用标准库regexp包来处理正则表达式,它提供了高效且安全的API。本文将通过具体示例,讲解该包的主要功能,帮助您立即将所学知识应用到实际项目中。
Go语言regexp包基础
regexp包实现了与RE2兼容的正则表达式语法(但不支持反向引用和前瞻/后顾断言)。这使得它快速且可预测。主要函数包括:
regexp.Compile(pattern)— 将模式编译为Regexp对象。如果模式无效则返回错误。regexp.MustCompile(pattern)— 功能相同,但出错时会引发panic。适用于静态模式。MatchString(pattern, s)— 检查字符串s是否包含与模式匹配的子串。
对于动态模式(例如来自用户输入),始终使用Compile;对于代码中硬编码的模式,使用MustCompile。
package main
import ( "fmt" "regexp")
func main() { // 对静态模式使用MustCompile re := regexp.MustCompile(`hello`) match := re.MatchString("hello world") fmt.Println(match) // true
// 对动态模式使用Compile pattern := "[0-9]+" re2, err := regexp.Compile(pattern) if err != nil { fmt.Println("编译错误:", err) return } fmt.Println(re2.MatchString("abc123")) // true}搜索和提取数据
通常不仅需要检查匹配,还需要提取字符串的特定部分。为此,可以使用FindString、FindStringSubmatch和FindAllString方法。
提取第一个匹配项
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\d+`) text := "代码: 12345, 价格: 678" // 第一个匹配项 first := re.FindString(text) fmt.Println(first) // 12345 // 所有匹配项 all := re.FindAllString(text, -1) fmt.Println(all) // [12345 678]}提取分组(子匹配)
模式中的分组(用圆括号表示)允许提取匹配的部分。FindStringSubmatch方法返回一个切片,其中第一个元素是完整匹配,后续元素是分组的值。
package main
import ( "fmt" "regexp")
func main() { // 模式:用户名@域名 re := regexp.MustCompile(`(\\w+)@(\\w+\\.\\w+)`) email := "user@example.com" match := re.FindStringSubmatch(email) if len(match) > 0 { fmt.Println("完整邮箱:", match[0]) // user@example.com fmt.Println("用户名:", match[1]) // user fmt.Println("域名:", match[2]) // example.com }}FindAllStringSubmatch方法对字符串中的所有匹配项执行相同操作。
使用正则表达式替换文本
regexp包提供了两种替换方法:ReplaceAllString(简单替换)和ReplaceAllStringFunc(使用函数的替换)。
简单替换
package main
import ( "fmt" "regexp")
func main() { re := regexp.MustCompile(`\\s+`) // 一个或多个空格 text := "Hello World Go" result := re.ReplaceAllString(text, " ") fmt.Println(result) // Hello World Go}使用分组进行替换
在替换字符串中,可以引用