news 2026/4/15 21:07:00

HoRain云--Go正则表达式终极指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HoRain云--Go正则表达式终极指南

🎬 HoRain云小助手:个人主页

🔥 个人专栏: 《Linux 系列教程》《c语言教程》

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

Go 语言正则表达式详解

一、基本概念

1.1 标准库介绍

1.2 编译正则表达式

二、常用操作

2.1 匹配检测

2.2 查找匹配

2.3 分组捕获

2.4 替换操作

2.5 分割字符串

三、正则表达式语法

3.1 常见元字符

3.2 贪婪与非贪婪匹配

四、最佳实践

4.1 预编译正则表达式

4.2 使用原生字符串

4.3 常用正则模式示例

五、注意事项


Go 语言正则表达式详解

Go 语言通过标准库regexp包提供正则表达式支持,基于 RE2 语法,与 Perl 和 Python 类似,但不支持所有特性(如反向引用)。

一、基本概念

1.1 标准库介绍

1.2 编译正则表达式

// Compile:返回错误,适合需要错误处理的场景 re, err := regexp.Compile(`\d+`) if err != nil { fmt.Println("编译失败:", err) return } // MustCompile:编译失败会 panic,适合已知合法的正则表达式 re := regexp.MustCompile(`[a-z]+`)

二、常用操作

2.1 匹配检测

// 简单匹配(不编译) match, _ := regexp.MatchString(`^hello`, "hello world") fmt.Println(match) // true // 使用编译后的正则表达式 re := regexp.MustCompile(`^\d{3}-\d{2}-\d{4}$`) fmt.Println(re.MatchString("123-45-6789")) // true

2.2 查找匹配

re := regexp.MustCompile(`\d+`) // 查找第一个匹配 text := "Order number 12345" fmt.Println(re.FindString(text)) // "12345" // 查找所有匹配 text2 := "Numbers: 123, 456, and 789." fmt.Println(re.FindAllString(text2, -1)) // ["123" "456" "789"]

2.3 分组捕获

re := regexp.MustCompile(`(\d+)-(\d+)-(\d+)`) text := "Today's date is 2025-01-25." // 获取匹配及其子组 submatches := re.FindStringSubmatch(text) // submatches[0] = "2025-01-25" (完整匹配) // submatches[1] = "2025" (第一个分组) // submatches[2] = "01" (第二个分组) // submatches[3] = "25" (第三个分组)

2.4 替换操作

// 简单替换 re := regexp.MustCompile(`cat`) result := re.ReplaceAllString("one cat, two cats", "dog") // "one dog, two dogs" // 使用分组引用 re = regexp.MustCompile(`(\w+)=(\w+)`) result = re.ReplaceAllString("name=John", "$2:$1") // "John:name" // 函数式替换 re = regexp.MustCompile(`\d+`) result = re.ReplaceAllStringFunc("A1 B2", func(s string) string { return "[" + s + "]" }) // "A[1] B[2]"

2.5 分割字符串

re := regexp.MustCompile(`\s*,\s*`) parts := re.Split("go, python, rust", -1) // ["go" "python" "rust"]

三、正则表达式语法

3.1 常见元字符

元字符含义
.匹配任意单个字符(除换行符外)
*匹配前面的字符零次或多次
+匹配前面的字符一次或多次
?匹配前面的字符零次或一次
[]匹配方括号内的任意一个字符
[^]匹配不在方括号内的任意一个字符
()分组
^匹配字符串的开头
$匹配字符串的结尾
\d匹配数字(等价于 [0-9])
\w匹配单词字符(等价于 [a-zA-Z0-9_])

3.2 贪婪与非贪婪匹配

text := "abccc" // 贪婪匹配(默认)- 尽可能多地匹配 re := regexp.MustCompile(`ab(c)+`) fmt.Println(re.FindString(text)) // "abccc" // 非贪婪匹配 - 尽可能少地匹配 re = regexp.MustCompile(`ab(c)+?`) fmt.Println(re.FindString(text)) // "abc"

四、最佳实践

4.1 预编译正则表达式

// ❌ 错误示例:在循环中重复编译 for _, text := range texts { re, _ := regexp.Compile(`\d+`) re.MatchString(text) } // ✅ 正确示例:预编译后复用 re := regexp.MustCompile(`\d+`) for _, text := range texts { re.MatchString(text) }

4.2 使用原生字符串

Go 支持使用反引号`创建原生字符串,避免转义问题:

// 清晰的写法 re := regexp.MustCompile(`[\[{(]\d+[)}\]]`) // 不需要像其他语言那样写成:"[\\[{(]\\d+[)}\\]]"

4.3 常用正则模式示例

// 邮箱验证 emailRe := regexp.MustCompile(`^[\w-]+@\w+\.\w+$`) // 手机号验证(中国大陆) phoneRe := regexp.MustCompile(`^1[3-9]\d{9}$`) // 日期格式转换:YYYY-MM-DD 转为 DD/MM/YYYY dateRe := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`) result := dateRe.ReplaceAllString("2023-08-15", "${3}/${2}/${1}") // "15/08/2023"

五、注意事项

  1. 不支持反向引用:Go 的正则表达式不支持\1这样的反向引用语法
  2. 错误处理:使用Compile时务必检查错误
  3. 性能考虑:正则表达式匹配可能较慢,尤其在处理大文本时
  4. 简化表达式:复杂的正则表达式难以维护,必要时拆分为多个简单正则

通过合理使用 Go 的regexp包,可以高效地完成字符串验证、文本解析和模式匹配等任务。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/15 18:16:40

计算机毕设java校园篮球互动平台 基于Java的校园篮球互动管理系统设计与实现 Java技术驱动的校园篮球互动平台开发

计算机毕设java校园篮球互动平台956ab9 (配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。 随着校园体育活动的蓬勃发展,篮球运动在学生群体中愈发受到欢迎。为了更好地…

作者头像 李华
网站建设 2026/4/13 17:50:45

低查重AI教材生成宝器!从框架搭建到内容撰写一站式搞定教材写作

在教材编写的过程中,如何平衡原创性和合规性是一个非常重要而又复杂的问题。虽然可以借鉴一些优秀教材的内容,但仍然担心查重率会超标;而如果全靠自己来创作知识点,又可能导致逻辑不够严密、内容的准确性没保障。引用他人工作时&a…

作者头像 李华
网站建设 2026/4/10 21:05:42

AI教材编写新趋势!低查重AI写教材工具,轻松搞定专业教材创作

选择 AI 教材编写工具的困扰与解决方案 在开始编写教材之前,选择合适的工具真是一个令人头疼的问题!如果用常规办公软件,功能总是显得不够全面,很多框架、格式的调整都得自己手动操心;而如果选择那些专业的 AI 教材编…

作者头像 李华
网站建设 2026/4/13 10:43:55

脑波分析工具:测试AR眼镜的认知负荷极限

AR眼镜的认知负荷挑战与测试需求 随着增强现实(AR)技术在消费电子、医疗和工业领域的广泛应用,AR眼镜的用户体验优化成为关键。然而,AR界面固有的信息过载问题可能导致用户认知负荷过高,影响任务效率和安全性。认知负…

作者头像 李华
网站建设 2026/4/11 1:31:27

嵌入式C++教程——引用计数的实现与性能

嵌入式C教程——引用计数的实现与性能 写引用计数的文章就像在讲“谁送快递给谁付钱”——每多一个人拿着快递,你的账本上就多记一笔;最后那个人把快递丢在门口,账本清零,快递就可以销毁。区别是:在嵌入式世界里&…

作者头像 李华