正则表达式
正则表达式用于匹配字符串模式,可搜索、替换、提取字符串。Go 中通过 regexp 包实现。
常用函数与方法
| 函数/方法 | 说明 |
|---|---|
| regexp.MustCompile(pattern) | 编译正则,失败直接 panic(编译期可确定模式时用) |
| regexp.Compile(pattern) | 编译正则,返回 (*Regexp, error),需检查错误 |
| MatchString(s) | 判断字符串是否匹配 |
| FindString(s) | 返回第一个匹配项 |
| FindAllString(s, n) | 返回所有匹配项,n 为 -1 表示全部 |
| FindStringSubmatch(s) | 返回第一个匹配及其捕获组 |
| ReplaceAllString(s, repl) | 把匹配的内容替换为 repl |
| Split(s, n) | 按正则分割字符串 |
性能敏感场景慎用正则。Go 里字符串中的反斜杠 \ 需要写成 \(在反引号原始字符串中不用转义,推荐用反引号写模式)。
基本语法
| 语法 | 说明 |
|---|---|
| . | 匹配任意单个字符(除换行) |
| * | 前面的字符出现 0 次或多次 |
| + | 前面的字符出现 1 次或多次 |
| ? | 前面的字符出现 0 次或 1 次 |
| \d | 数字,等价 [0-9] |
| \w | 字母数字下划线,等价 [a-zA-Z0-9_] |
| \s | 空白字符(空格、制表符、换行) |
| [] | 匹配括号内任意一个字符 |
| ^ | 匹配开头 |
| $ | 匹配结尾 |
匹配判断
package main
import (
"fmt"
"regexp"
)
func main() {
pattern := `^[a-zA-Z0-9]+$`
regex := regexp.MustCompile(pattern)
if regex.MatchString("Hello123") {
fmt.Println("字符串匹配正则表达式")
} else {
fmt.Println("字符串不匹配正则表达式")
}
}
不用的包不要 import。如果只是判断一次匹配,可直接用 regexp.MatchString(pattern, str)。
查找匹配
package main
import (
"fmt"
"regexp"
)
func main() {
regex := regexp.MustCompile(`\d+`)
str := "我有 3 个苹果和 5 个香蕉"
matches := regex.FindAllString(str, -1) // -1 表示返回所有匹配
fmt.Println("找到的数字:", matches)
}
捕获子组
用圆括号 () 分组,FindStringSubmatch 返回第一个匹配的整体和各个分组。
package main
import (
"fmt"
"regexp"
)
func main() {
// (\w+) 捕获名字,(\d+) 捕获年龄
regex := regexp.MustCompile(`我的名字是(\w+),今年(\d+)岁`)
str := "大家好,我的名字是张三,今年25岁"
sub := regex.FindStringSubmatch(str)
fmt.Println("整体:", sub[0])
fmt.Println("名字:", sub[1])
fmt.Println("年龄:", sub[2])
}
替换
package main
import (
"fmt"
"regexp"
)
func main() {
regex := regexp.MustCompile(`\s+`)
str := "Hello World"
result := regex.ReplaceAllString(str, " ")
fmt.Println("替换后的字符串:", result)
}
常用正则示例
package main
import (
"fmt"
"regexp"
)
func main() {
// 邮箱
emailRe := regexp.MustCompile(`^\w+@\w+(\.\w+)+$`)
fmt.Println("邮箱:", emailRe.MatchString("test@example.com"))
// 手机号(中国大陆,1开头11位)
phoneRe := regexp.MustCompile(`^1[3-9]\d{9}$`)
fmt.Println("手机号:", phoneRe.MatchString("13812345678"))
// URL
urlRe := regexp.MustCompile(`^(https?://)?[\w.-]+\.[a-z]{2,}(/\S*)?$`)
fmt.Println("URL:", urlRe.MatchString("https://www.runoob.com/go/go-tutorial.html"))
}
从一段文本中提取所有 URL,用 FindAllString + 反引号模式字符串即可。