初面网初面网

正则表达式

正则表达式用于匹配字符串模式,可搜索、替换、提取字符串。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 + 反引号模式字符串即可。

更新于 2026/8/13