0

0

如何在Golang中使用regexp匹配正则表达式_查找和替换文本

P粉602998670

P粉602998670

发布时间:2026-01-05 08:28:02

|

974人浏览过

|

来源于php中文网

原创

Go 的 regexp 包基于 RE2 引擎,支持查找、替换、分割和验证,但不支持回溯引用等 PCRE 高级特性;推荐用 MustCompile 编译固定正则,再调用 MatchString、FindString 等方法;需位置信息时用 FindStringIndex 或 FindStringSubmatchIndex;替换可用 ReplaceAllString 或函数式 ReplaceAllStringFunc;注意转义、捕获组编号从 1 开始、用户输入应使用 Compile 而非 MustCompile。

如何在golang中使用regexp匹配正则表达式_查找和替换文本

在 Go 语言中,regexp 包提供了完整的正则表达式支持,可用于查找、替换、分割和验证文本。它不支持 PCRE 的某些高级特性(如回溯引用、条件匹配),但对大多数常见场景已足够强大且性能优秀。

基础匹配:查找是否符合模式

使用 regexp.MustCompile 编译正则(推荐用于固定正则),再调用 MatchStringFindString 等方法:

  • MatchString(pattern, text):返回 bool,仅判断是否匹配
  • FindString(text):返回第一个匹配的子串(string)
  • FindAllString(text, n):返回最多 n 个匹配的字符串切片(n = -1 表示全部)

示例:

r := regexp.MustCompile(`\b\w+@\w+\.\w+\b`)
emails := r.FindAllString("Contact us at support@example.com or sales@test.org", -1)
// 结果:["support@example.com", "sales@test.org"]

带位置信息的匹配:获取索引与子匹配

当需要知道匹配位置或提取分组内容时,用 FindStringSubmatchFindStringIndex

立即学习go语言免费学习笔记(深入)”;

RoboNeo
RoboNeo

专注影像与设计的AI助手

下载
  • FindStringIndex(text):返回 [2]int,表示起始和结束字节索引
  • FindStringSubmatch(text):返回匹配的原始字节切片(含捕获组)
  • FindStringSubmatchIndex(text):返回所有捕获组的索引数组,主匹配在索引 0,后续组依次排列

示例(提取域名):

r := regexp.MustCompile(`(\w+)@(\w+\.\w+)`)
matches := r.FindStringSubmatchIndex([]byte("user@gmail.com"))
// matches[0] 是整个匹配位置,matches[2] 是第二个括号(域名)的位置

文本替换:简单替换与动态逻辑

替换主要靠 ReplaceAllString 和更灵活的 ReplaceAllStringFuncReplaceAllStringSubmatchFunc

  • ReplaceAllString(text, repl):将所有匹配替换为固定字符串
  • ReplaceAllStringFunc(text, func(string) string):对每个匹配子串执行函数,返回替换结果
  • ReplaceAllStringSubmatchFunc(text, func(string) string):传入的是整个匹配(含捕获组),适合复杂逻辑

示例(手机号脱敏):

r := regexp.MustCompile(`1[3-9]\d{9}`)
masked := r.ReplaceAllStringFunc("Call 13812345678 now", func(s string) string {
  return s[:3] + "****" + s[7:]
})
// 结果:"Call 138****5678 now"

注意事项与常见陷阱

Go 的正则引擎是 RE2,强调安全与线性时间复杂度,因此部分语法不支持:

  • 不支持 \1 这类反向引用,也不能在替换字符串中直接写 $1
  • 捕获组编号从 1 开始,$0 表示整个匹配(仅在 ReplaceAllLiteralString 等少数方法中可用)
  • 注意转义:在 Go 字符串字面量中,反斜杠需双写,如 `\\d+` 表示一个数字序列
  • 编译失败会 panic,若正则来自用户输入,应使用 regexp.Compile 并检查 error

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

177

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

225

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

336

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

207

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

388

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

194

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

189

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

191

2025.06.17

深入理解算法:高效算法与数据结构专题
深入理解算法:高效算法与数据结构专题

本专题专注于算法与数据结构的核心概念,适合想深入理解并提升编程能力的开发者。专题内容包括常见数据结构的实现与应用,如数组、链表、栈、队列、哈希表、树、图等;以及高效的排序算法、搜索算法、动态规划等经典算法。通过详细的讲解与复杂度分析,帮助开发者不仅能熟练运用这些基础知识,还能在实际编程中优化性能,提高代码的执行效率。本专题适合准备面试的开发者,也适合希望提高算法思维的编程爱好者。

1

2026.01.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Go 教程
Go 教程

共32课时 | 3.4万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号