当前位置: 首页 > 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 中使用。

相关文章:

  • 博奥龙表观遗传相关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实现多机多卡训练
  • 广东省住房和城乡建设局网站首页/如何让自己的网站快速被百度收录
  • 新乡市做网站的公司/网站开发流程
  • wordpress 站长统计/软文广告500字
  • 香港免费永久网站/百度推广费用多少
  • 现在做网站怎么赚钱/百度平台客服电话
  • 东港区网站制作/互换链接的方法