Go-11-正则表达式与字符串高级处理
本节目标:掌握 Go 的
regexp包,能写日志分析、URL 解析、表单验证等常见正则任务。
1. regexp 包基础
Go 的正则引擎是 RE2(不是 PCRE),保证线性时间且没有灾难性回溯。
1 | import "regexp" |
编译错误:
1 | re, err := regexp.Compile(`\d+`) // 错误用 Compile,返回 error |
2. 常用操作
2.1 Match:是否匹配
1 | re := regexp.MustCompile(`^1[3-9]\d{9}$`) |
2.2 Find:查找
1 | re := regexp.MustCompile(`\d+`) |
2.3 Replace:替换
1 | re := regexp.MustCompile(`\s+`) |
2.4 Split:分割
1 | re := regexp.MustCompile(`[,;]\s*`) |
2.5 FindSubmatch:捕获组
1 | re := regexp.MustCompile(`(\w+)@(\w+)\.(\w+)`) |
3. 实战:日志分析
Nginx 访问日志格式:
1 | 192.168.1.1 - - [10/Oct/2023:13:55:36 -0700] "GET /api/users HTTP/1.1" 200 1234 |
1 | type LogEntry struct { |
4. 实战:URL 参数解析
1 | // 从 URL 提取参数值 |
更好的方法:用 net/url 包
1 | import "net/url" |
5. 实战:邮箱/手机号/URL 验证
1 | var ( |
注意:正则验证不能 100% 准确。比如邮箱正则看似严格,但实际 a@b.c 也是合法邮箱。生产环境应该先正则粗筛 + 再发送验证邮件。
6. 性能优化
1. 预编译正则(最重要):
1 | // 错:每次调用都编译 |
**2. 用 Compile 而不是 MustCompile**(如非配置/常量正则)。
3. 避免贪婪匹配:
1 | // 贪婪:可能回溯 |
4. 用 regexp.MatchString 一次性检查:
1 | ok, _ := regexp.MatchString(`^pattern`, s) // 一次性,内部编译 |
7. 高级特性
7.1 零宽断言
1 | // 前瞻:(?=...) |
7.2 非捕获组
1 | re := regexp.MustCompile(`(?:foo|bar)+`) // 圆括号不捕获 |
7.3 标志位
1 | re := regexp.MustCompile(`(?i)abc`) // 不区分大小写 |
8. 实战:从 HTML 提取数据
1 | // 简单提取 <a href="...">title</a> |
警告:生产环境用 golang.org/x/net/html 包,正则解析 HTML 容易出错。
9. 实战:批量提取/替换
1 | // 把 markdown 链接 [text](url) 替换成 HTML <a href="url">text</a> |
10. 字符串模板(text/template)
比正则更结构化的字符串处理:
1 | import "text/template" |
条件、循环、函数:
1 | const tmpl = ` |
小结
| 场景 | 工具 |
|---|---|
| 简单匹配/提取 | regexp |
| URL 参数 | net/url |
| HTML 解析 | golang.org/x/net/html |
| 字符串模板 | text/template |
| 路径操作 | path/filepath |
正则最佳实践:
- 预编译正则为包级变量
- 避免回溯爆炸(RE2 引擎已经保证)
- 不要用正则解析 HTML/XML/JSON(用专用 parser)
- 测试用例要全(边界、Unicode、emoji)
下一节深入并发:sync.Mutex、sync.WaitGroup、context、连接池。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/08/22/Go-11-正则与字符串高级处理/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!