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

Go语言中regexp模块详细功能介绍与示例

Go语言的 regexp 模块提供了正则表达式操作,支持模式匹配、查找、替换和分割等功能。以下是核心方法及示例:


1. 编译正则表达式

regexp.Compile

编译正则表达式,返回 *Regexp 对象。如果正则非法,返回错误。

re, err := regexp.Compile(`\d+`)
if err != nil {
    panic(err)
}
fmt.Println(re.MatchString("123")) // 输出: true
regexp.MustCompile

编译正则表达式,如果失败直接 panic(适用于全局变量初始化)。

re := regexp.MustCompile(`\d+`)
fmt.Println(re.MatchString("abc")) // 输出: false

2. 匹配检查

MatchString

直接检查字符串是否匹配正则表达式(无需编译)。

matched, _ := regexp.MatchString(`\d+`, "2023")
fmt.Println(matched) // 输出: true
Regexp.MatchString

使用预编译的正则对象检查匹配。

re := regexp.MustCompile(`^[A-Za-z]+$`)
fmt.Println(re.MatchString("Hello")) // 输出: true

3. 查找匹配

FindString

查找第一个匹配的字符串。

re := regexp.MustCompile(`\d+`)
fmt.Println(re.FindString("year 2023, month 12")) // 输出: 2023
FindAllString

查找所有匹配的字符串。

re := regexp.MustCompile(`\d+`)
matches := re.FindAllString("2023-12-31", -1)
fmt.Println(matches) // 输出: [2023 12 31]
FindStringIndex

返回第一个匹配的起始和结束索引。

re := regexp.MustCompile(`\d+`)
index := re.FindStringIndex("year 2023")
fmt.Println(index) // 输出: [5 9](匹配"2023")

4. 子匹配组(分组捕获)

FindStringSubmatch

查找第一个匹配及其子组。

re := regexp.MustCompile(`(\d{4})-(\d{2})-(\d{2})`)
match := re.FindStringSubmatch("2023-12-31")
fmt.Println(match) // 输出: [2023-12-31 2023 12 31]
FindAllStringSubmatch

查找所有匹配及其子组。

re := regexp.MustCompile(`(\d+)-(\d+)`)
matches := re.FindAllStringSubmatch("2023-12 1999-01", -1)
fmt.Println(matches)
// 输出: [[2023-12 2023 12] [1999-01 1999 01]]

5. 替换操作

ReplaceAllString

替换所有匹配项(支持 $1 引用子组)。

re := regexp.MustCompile(`(\d+)-(\d+)`)
result := re.ReplaceAllString("2023-12", "$2/$1")
fmt.Println(result) // 输出: 12/2023
ReplaceAllLiteralString

字面量替换(不解析 $1)。

re := regexp.MustCompile(`\d+`)
result := re.ReplaceAllLiteralString("123", "X")
fmt.Println(result) // 输出: X
ReplaceAllFunc

通过函数动态生成替换内容。

re := regexp.MustCompile(`\d+`)
result := re.ReplaceAllStringFunc("123", func(s string) string {
    return "[" + s + "]"
})
fmt.Println(result) // 输出: [123]

6. 分割字符串

Split

根据正则分割字符串。

re := regexp.MustCompile(`\s*,\s*`) // 匹配逗号及周围空格
parts := re.Split("a, b, c", -1)
fmt.Println(parts) // 输出: [a b c]

7. 扩展功能

Expand

动态生成替换内容(结合子组)。

re := regexp.MustCompile(`(\d+)-(\d+)`)
src := []byte("2023-12")
dst := []byte{}
template := []byte("Year: $1, Month: $2")
result := re.Expand(dst, template, src, re.FindSubmatchIndex(src))
fmt.Println(string(result)) // 输出: Year: 2023, Month: 12

8. 其他方法

QuoteMeta

转义正则中的特殊字符。

escaped := regexp.QuoteMeta(`.*+?^$()[]{}|`)
fmt.Println(escaped) // 输出: \.\*\+\?\^\$\(\)\[\]\{\}\|
Longest

启用最长匹配模式(默认贪婪模式)。

re := regexp.MustCompile(`a+?`).Longest() // 关闭贪婪模式
fmt.Println(re.FindString("aaaa"))       // 输出: aaaa

总结

  • 核心方法
    • 编译:Compile, MustCompile
    • 匹配:MatchString, FindString, FindAllString
    • 替换:ReplaceAllString, ReplaceAllFunc
    • 分割:Split
    • 子组:FindStringSubmatch, FindAllStringSubmatch
  • 高级功能
    • 动态替换:Expand
    • 转义:QuoteMeta
  • 注意事项
    • 预编译正则表达式(Compile)提升性能。
    • *Regexp 对象是线程安全的,可在多个 goroutine 中使用。
http://www.dtcms.com/a/95681.html

相关文章:

  • 博奥龙表观遗传相关CHIP级抗体
  • RAG生成中的多文档动态融合及去重加权策略探讨
  • 适配 AGP8.5 版本,转换过程(四)
  • 探秘Transformer系列之(19)----FlashAttention V2 及升级版本
  • STM32F103_LL库+寄存器学习笔记06 - 梳理串口与串行发送“Hello,World“
  • rbpf虚拟机-call指令
  • Pyside6介绍和开发第一个程序
  • 【bug解决】NameError: name ‘fused_act_ext‘ is not defined
  • 频谱分析仪的最大保持功能
  • 重大SBOM风险预警 | 总下载量超百万次开源NPM组件被投毒
  • 解决orzdba采集数据库性能指标不全的问题
  • 【图像处理基石】什么是joint demosaicking and denoising算法?
  • 未授权rce漏洞
  • 工作记录 2017-03-10
  • JAVASCRIPT 异步函数:底层原理,fetch,promise实例方法then, catich
  • 计算机二级(C语言)考试高频考点总汇(四)—— 内存管理、文件操作、预处理
  • 认识一家公司:瑞芯微(Rockchip Electronics Co., Ltd.)以及旗下的两款芯片RK3288\RK3588
  • 工程数字建造管理系统平台有哪些?好的数字建造管理系统推荐
  • c++,宏 - 在debug/release中都能用的断言
  • 3、fabric实现多机多卡训练
  • 性能测试核心流程和概念
  • NoSQL 数据库的适用场景与局限性分析
  • 常用的测试用例
  • level2数据说明,逐笔成交,逐笔委托,股票十档行情
  • 在海量数据中精准定位:BloomFilter的工作原理与实战指南
  • linux ACL权限控制之组权限控制程序设计
  • 卡特兰数问题
  • 端侧设备(如路由器、家庭网关、边缘计算盒子、工业网关等)的典型系统、硬件配置和内存大小
  • 【矩阵快速幂】P2100 凌乱的地下室|省选-
  • AI+基础工具:解锁业务增长原子级能力,To B 落地新方向