Go 语言正则表达式

正则表达式用一段"模式串"去匹配文本,是校验、提取、清洗文本的利器。Go 标准库 regexp 提供完整支持,套路固定:先用 Compile(或 MustCompile)把模式编译成 Regexp 对象,再调用它的匹配、查找、替换、分割方法。(说明:片段需放入 main 函数并补 import 运行)

Compile 与 MustCompile

package main

import (
	"fmt"
	"regexp"
)

func main() {
	re, err := regexp.Compile(`\d+`) // 编译失败时返回错误
	if err != nil {
		fmt.Println("模式错误:", err)
		return
	}
	fmt.Println(re.MatchString("abc123")) // 输出:true(包含数字)

	// MustCompile:模式写错直接 panic,适合包级别固定的模式
	re2 := regexp.MustCompile(`\d+`)
	fmt.Println(re2.MatchString("全是汉字")) // 输出:false
}

模式用反引号书写,\d 不必写成 \\d。MatchString 只判断"是否包含匹配",不管匹配位置。

FindString 与 FindAllString:查找

re := regexp.MustCompile(`\d+`)
fmt.Println(re.FindString("单价 25 元"))         // 输出:25(第一个匹配)
fmt.Println(re.FindAllString("a1 b22 c333", -1)) // 输出:[1 22 333]
fmt.Println(re.FindAllString("a1 b22", 1))       // 输出:[1](限制数量)
fmt.Println(re.FindStringIndex("x12y"))          // 输出:[1 3](起止位置)

分组:FindStringSubmatch

用括号 () 捕获分组,Submatch 返回"整体匹配 + 各分组":

re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
m := re.FindStringSubmatch("日期:2024-05-01 发布")
fmt.Println(m) // 输出:[2024-05-01 2024 05 01]

下标 0 是整串,1、2、3 分别对应各组内容。

替换与分割:ReplaceAllString、Split

re := regexp.MustCompile(`\s+`) // 一个或多个空白
fmt.Println(re.ReplaceAllString("a  b   c", "-")) // 输出:a-b-c

sp := regexp.MustCompile(`[,;]`)
fmt.Println(sp.Split("a,b;c", -1)) // 输出:[a b c]

常见模式示例:手机号、邮箱、URL

phone := regexp.MustCompile(`^1[3-9]\d{9}$`) // ^ $ 锚定整串
fmt.Println(phone.MatchString("13800138000")) // 输出:true
fmt.Println(phone.MatchString("23800138000")) // 输出:false

email := regexp.MustCompile(`^[\w.]+@[\w.]+\.\w+$`)
fmt.Println(email.MatchString("go@example.com")) // 输出:true

urlRe := regexp.MustCompile(`https?://[^\s]+`)
fmt.Println(urlRe.FindString("官网 https://go.dev 见")) // 输出:https://go.dev

语法限制

Go 采用 RE2 引擎:线性时间、无灾难性回溯,安全高效;代价是不支持反向引用(\1)、环视(前瞻/后顾)等特性,遇到这类需求要改写为等价模式或用代码处理。

小结:regexp 的流程是 Compile/MustCompile 后调用 MatchString、Find(All)(String(Submatch))、ReplaceAllString、Split;配合手机号/邮箱/URL 等常用模式即可覆盖大多数文本处理。

笔记加载中…