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

news/2025/11/1 15:21:41/文章来源:https://www.cnblogs.com/gccbuaa/p/19183405

文章目录

    • 一、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.mzph.cn/news/952851.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JBoltAI 智能企业内训平台深度解析

企业内训智能化转型新标杆:JBoltAI 智能企业内训平台 在数字化转型浪潮下,企业培训模式正经历着从传统线下授课到全流程智能化的颠覆性变革。JBoltAI 智能企业内训平台作为企业培训领域的创新解决方案,凭借其 AI 驱…

2025 年 11 月云南财务服务,云南财税咨询,昆明代理记账公司最新推荐,技术实力与市场口碑深度解析!

2025 年 11 月,省税务师协会联合省数字财税发展研究院,针对全省 92 家开展云南财务服务、云南财税咨询、昆明代理记账业务的机构,开展以 “技术硬实力 + 市场好口碑” 为核心的专项测评。本次测评采用 “量化考核 +…

第四十五章 ESP32S3 Flash 模拟 U 盘实验 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

JBoltAI框架揭秘:如何为Java应用注入“企业级AI知识库”能力

JBoltAI框架揭秘:如何为Java应用注入“企业级AI知识库”能力在企业级AI应用中,RAG(检索增强生成)是实现智能问答、决策辅助等场景的核心技术。而其根基,在于一个高效、可控的AI知识库。今天,我们将深入介绍JBolt…

2025 年 11 月云南财税服务,昆明财税代理,云南代理记账公司最新推荐,实力品牌深度解析采购无忧之选!

2025 年 11 月,省注册会计师协会联合省中小企业财税服务联盟,针对全省 87 家开展云南财税服务、昆明财税代理、云南代理记账业务的机构,开展 “实力品牌专项测评”。本次测评采用 “三维度权重评估法”:品牌资质维…

电脑恢复技巧:适用于 Windows 的 9 款最佳分区恢复软件

磁盘分区对于妥善存储数据、方便快捷地从硬盘访问数据至关重要。然而,如果分区损坏,其中存储的所有数据将突然无法访问。磁盘分区损坏的原因有很多,其中最常见的包括病毒攻击、突然断电、物理损坏或坏扇区的产生。 …

2025 年 11 月云南环保咨询,云南环评手续咨询,云南环评批复咨询最新推荐:聚焦资质、案例、售后的五家机构深度解读!

为解决云南企业在环评服务选型中 “资质真伪难辨、案例适配性不明、售后保障缺失” 的核心痛点,云南省环境保护产业协会联合省环境工程评估中心开展 2025 年度专项测评,覆盖全省 268 家咨询机构,最终筛选出 5 家在资…

20251031周五日记

20251031周五日记今日: 1.起的贼早,去实验室看会儿文章去和祥吃必胜客炉石联动。被上了一课,以后要更明确地懂别人的隐藏动作意思呀。陪他买个蛋糕回去上课了。 2.回去先把东西放回宿舍,把杜的信寄走。去听汇报和课…

完整教程:毕设项目基于Django的医药管理系统\251006(白嫖源码+演示录像)可做计算机毕设JAVA、PHP、爬虫、APP、小程序、C#、C++、python、数据可视化、文案

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CSP-J 2025 题解

第一题:拼数 (number) 思路分析 题目要求使用一个字符串中包含的数字字符拼成一个最大的正整数。 要组成最大的数,我们的策略应该是把越大的数字放在越高的位(即越靠前的位置)。例如,用数字 \(9, 2, 1, 0, 0\) 能…

人工智能之编程基础 Python 入门:第五章 基本数据类型(一)

人工智能之编程基础 Python 入门:第五章 基本数据类型(一)人工智能之编程基础 Python 入门 第五章 基础数据类型(一)@目录人工智能之编程基础 Python 入门前言Number(数字)1. 整数 (int)特点:示例:2. 浮点数 …

150行的推箱子游戏

150行的推箱子游戏#include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <ncurses.h> #include <algorithm> t…

嵌入式制作笔记(1)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

tmp2

3、复杂模型机累加指令 ;/*** Start Of Main Memory Data ****/ $P 00 20 ;START: IN R0,00H 从IN单元读入计数初值 $P 01 00 $P 02 61 ;LDI R1,0FH $P 03 0F ;立即数0FH送R1 $P 04 14 ;AND R0,R1 得到R0低…

中国移动获得手机直连卫星通讯牌照:行业变革的催化剂 - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025 年 11 月抗衰老精华液,修护精华液,保湿精华液 OEM/ODM 加工厂最新推荐,聚焦高端定制需求与全案交付能力!

据国际高端美妆供应链协会 2025 年 10 月发布的《功效型精华代加工定制服务报告》显示,抗衰老、修护、保湿类精华高端定制 OEM/ODM 需求同比增长 61%,但 45% 的品牌方反馈合作工厂存在 “定制方案单一、全案交付断层…

2025 年 11 月烟酰胺精华液,富勒烯精华液,液态精华液 OEM/ODM 加工厂最新推荐,精准检测与稳定性能深度解析!

据国际美妆检测协会 2025 年 10 月发布的《液态功效型精华代加工检测与稳定性报告》显示,烟酰胺、富勒烯、液态类精华 OEM/ODM 需求同比增长 55%,但 43% 的品牌方反馈合作工厂存在 “检测标准不统一、液态性能不稳定…

2025 年 11 月复合酸精华液,抗衰老精华液,抗氧化精华液 OEM/ODM 加工厂最新推荐,技术实力与市场口碑深度解析!

据国际美妆技术协会 2025 年 10 月发布的《功效型精华代加工技术与口碑报告》显示,复合酸、抗衰老、抗氧化类精华 OEM/ODM 需求同比增长 58%,但 44% 的品牌方反馈合作工厂存在 “核心技术薄弱、研发创新不足、市场口…

2025 年 11 月烟酰胺精华液,抗衰老精华液,修护精华液 OEM/ODM 加工厂最新推荐,产能、专利、环保三维数据透视

据国际美妆供应链协会 2025 年 10 月发布的《功效型精华代加工三维评估报告》显示,烟酰胺、抗衰老、修护类精华 OEM/ODM 需求同比增长 52%,但 39% 的品牌方反馈合作工厂存在 “产能不足延误交付、核心技术缺失、环保…