当前位置: 首页 > news >正文

Go基础:正则表达式 regexp 库详解 - 指南

文章目录

    • 一、Go 正则表达式概述
      • 1.1 标准库 `regexp`
      • 1.2 使用建议
    • 二、正则表达式的基本操作
      • 2.1 编译正则表达式
      • 2.2 案例:编译正则表达式
    • 三、正则表达式匹配操作
      • 3.1 完全匹配
      • 3.2 查找匹配
      • 3.3 查找所有匹配
    • 四、正则表达式分组和捕获
      • 4.1 使用分组捕获
    • 五、正则表达式替换操作
      • 5.1 替换匹配的字符串
      • 5.2 使用函数替换
    • 六、正则表达式分割字符串
    • 七、正则表达式高级用法
      • 7.1 贪婪与非贪婪匹配

一、Go 正则表达式概述

1.1 标准库 regexp

Go 的 regexp 语言通过标准库 regexp 提供了对正则表达式的支持,支持正则表达式的编译、匹配、查找、替换等操作,实现了正则表达式的搜索和替换操作。它使用 RE2 语法,与 Perl 和 Python 类似,但不支持所有特性(如反向引用)。regexp 包提供了两种主要接口:

1.2 使用建议

  1. 预编译正则表达式:如果正则表达式会被多次使用,建议预编译以提高性能。
  2. 错误处理:使用 Compile 时检查错误,避免运行时 panic。
  3. 避免过度复杂:复杂的正则表达式难以维护,必要时拆分为多个简单正则。
  4. 合理使用分组:分组捕获可以提取关键信息,但要注意索引顺序。
  5. 注意性能:正则表达式匹配可能较慢,尤其在处理大文本时,应尽量优化。

二、正则表达式的基本操作

2.1 编译正则表达式

推荐使用 CompileMustCompile 来编译正则表达式:

  • regexp.Compile(pattern):返回 *Regexperror,如果正则表达式不合法会返回错误。
  • regexp.MustCompile(pattern):如果正则表达式不合法,会 panic,适用于已知合法的正则表达式。

2.2 案例:编译正则表达式

package main
import (
"fmt"
"regexp"
)
func main() {
// 使用 Compile,处理可能的错误
re, err := regexp.Compile(`\d+`)
if err != nil {
fmt.Println("正则表达式编译失败:", err)
return
}
fmt.Println("编译成功:", re)
// 使用 MustCompile,确定正则合法时使用
re2 := regexp.MustCompile(`[a-z]+`)
fmt.Println("MustCompile 成功:", re2)
}

三、正则表达式匹配操作

3.1 完全匹配

使用 MatchString 检查字符串是否完全匹配正则表达式。

案例:MatchString

package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`^go$`)
fmt.Println(re.MatchString("go"))     // true
fmt.Println(re.MatchString("golang")) // false
}

3.2 查找匹配

查找第一个匹配:使用 FindString 查找第一个匹配的子串。案例:FindString

package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`\d+`)
fmt.Println(re.FindString("abc123def")) // "123"
fmt.Println(re.FindString("abcdef"))    // ""
}

3.3 查找所有匹配

使用 FindAllString 查找所有匹配的子串。案例:FindAllString

package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`\d+`)
fmt.Println(re.FindAllString("abc123def456", -1)) // ["123", "456"]
fmt.Println(re.FindAllString("abc123def456", 1))  // ["123"]
}

四、正则表达式分组和捕获

4.1 使用分组捕获

使用 FindStringSubmatch 获取分组匹配结果。案例:分组捕获

package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
match := re.FindStringSubmatch("2025-09-09")
if match != nil {
fmt.Println("完整匹配:", match[0])   // 2025-09-09
fmt.Println("年份:", match[1])       // 2025
fmt.Println("月份:", match[2])       // 09
fmt.Println("日期:", match[3])       // 09
}
}

五、正则表达式替换操作

5.1 替换匹配的字符串

使用 ReplaceAllString 替换所有匹配的子串。案例:ReplaceAllString

package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`\d+`)
result := re.ReplaceAllString("abc123def456", "数字")
fmt.Println(result) // "abc数字def数字"
}

5.2 使用函数替换

使用 ReplaceAllStringFunc 对每个匹配结果应用函数。案例:ReplaceAllStringFunc

package main
import (
"fmt"
"regexp"
"strconv"
)
func main() {
re := regexp.MustCompile(`\d+`)
result := re.ReplaceAllStringFunc("abc123def456", func(s string) string {
num, _ := strconv.Atoi(s)
return strconv.Itoa(num * 2)
})
fmt.Println(result) // "abc246def912"
}

六、正则表达式分割字符串

使用 Split 按正则表达式分割字符串。案例:Split

package main
import (
"fmt"
"regexp"
)
func main() {
re := regexp.MustCompile(`\s+`)
fmt.Println(re.Split("a b  c   d", -1)) // ["a", "b", "c", "d"]
}

七、正则表达式高级用法

7.1 贪婪与非贪婪匹配

Go 默认是贪婪匹配(尽可能多地匹配),可以使用 ? 转为非贪婪匹配。案例:贪婪与非贪婪

package main
import (
"fmt"
"regexp"
)
func main() {
reGreedy := regexp.MustCompile(`<.*>`)reNonGreedy := regexp.MustCompile(`<.*?>`)html := "<div>hello</div>"fmt.Println(reGreedy.FindString(html))       // "<div>hello</div>"fmt.Println(reNonGreedy.FindString(html))    // "<div>"}

总结:Go 的 regexp 包提供了强大的正则表达式支持。

  • 支持编译、匹配、查找、替换、分割等操作。
  • 使用分组可以提取关键信息。
  • 贪婪与非贪婪匹配可以灵活控制匹配行为。
  • 正则表达式虽然强大,但应合理使用,避免过度复杂。
http://www.gsyq.cn/news/36910.html

相关文章:

  • JBoltAI 智能企业内训平台深度解析
  • 2025 年 11 月云南财务服务,云南财税咨询,昆明代理记账公司最新推荐,技术实力与市场口碑深度解析!
  • JBoltAI框架揭秘:如何为Java应用注入“企业级AI知识库”能力
  • 破解AI招生平台痛点!JBoltAI-RAG如何搞定上千份相似招生简章的检索难题
  • 2025 年 11 月云南财税服务,昆明财税代理,云南代理记账公司最新推荐,实力品牌深度解析采购无忧之选!
  • 嵌入式制作笔记(1)
  • 2025 年 11 月烟酰胺精华液,富勒烯精华液,液态精华液 OEM/ODM 加工厂最新推荐,精准检测与稳定性能深度解析!
  • 2025 年 11 月复合酸精华液,抗氧化精华液,液态精华液 OEM/ODM 加工厂最新推荐,榜单透视与选购要点解析!
  • 2.4G低功耗
  • 2025年权威解析与推荐:淮安广联纸业产业布局与战略发展深度分析
  • 1069:乘方计算快速幂
  • 本地化知识库:RAGFlow
  • 2025年11月打印纸推荐榜:口碑好厂家全方位分析与购买建议
  • Godot Render Pipeline
  • 2025年11月打印纸品牌推荐排行:有实力的生产厂家详细评价
  • 如何调整敏感度标签的离线访问期限
  • 2025年11月打印纸推荐评测:有实力工厂详细比较与采购指南
  • HTTP 与 SOCKS5 代理协议:企业级选型指南与工程化实践 - Smart
  • 2025年11月专机成套设备推荐评测:五家口碑好工厂详细分析
  • Java 团队搞 AI 开发难?JBoltAI 框架手把手教你快速落地企业级 AI 应用
  • 2025年11月专机成套设备推荐榜单:五家实力厂家综合对比分析
  • Java 团队做 AI 应用怕踩坑?JBoltAI 有工单服务 + 案例库,开发全程有保障
  • 2025年11月数控铣床生产厂家排行:专业机构权威数据对比指南
  • 2025年11月新能源重卡推荐榜单:权威对比与综合评测分析
  • 2025年11月新能源重卡排行:专业工厂与靠谱品牌的全面评测
  • 2025年11月自动挡重卡评价排行:正规品牌多维度深度解析
  • 免费白嫖一年Perplexity Pro
  • 2025年11月上海装修公司评测排行:真实数据与选择要点指南
  • 卷积神经网络的引入1--MLP再图像像素平移之后的局限性
  • 2025年11月武汉刑事律师推荐榜单:专业刑辩律师综合对比分析