Golang中正则表达式语法及相关示例

 更新时间:2024年05月13日 10:05:33   作者:grb123  
正则表达式是一种用于匹配和操作文本的强大工具,它使用特殊的字符和语法来定义模式,下面这篇文章主要给大家介绍了关于Golang中正则表达式语法及相关示例的相关资料,需要的朋友可以参考下

1. Golang中的正则表达式包

Golang提供了内置的regexp包,用于处理正则表达式操作。该包提供正则表达式对象,可以执行各种文本操作,如匹配、查找和替换。

Golang中的regexp包提供了一组函数和类型,用于处理正则表达式。以下是一些常用的函数:

  • regexp.Compile : 编译正则表达式,返回正则对象。
  • regexp.Match : 判断文本是否与正则表达式匹配。
  • regexp.FindString : 查找并返回第一个匹配的字符串。
  • regexp.FindAllString : 查找并返回所有匹配的字符串。
  • regexp.ReplaceAllString : 替换所有匹配的字符串。

2. 正则表达式语法简述

在使用正则表达式时,了解其语法规则至关重要。以下是一些常用的正则表达式元字符及其含义:

  • . : 匹配任意字符,除了换行符。
  • * : 匹配前一个字符零次或多次。
  • + : 匹配前一个字符一次或多次。
  • ? : 匹配前一个字符零次或一次。
  • \d : 匹配数字字符。
  • \w : 匹配字母、数字或下划线。
  • [] : 字符集,匹配括号内的任意一个字符。

3. 相关示例

邮箱匹配

package main

import (
 "fmt"
 "regexp"
)

func main() {
	text := "邮箱是 demo@qq.com 。"
	re := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}`)
	matches := re.FindStringSubmatch(text)
	if len(matches) > 0 {
		fmt.Println("匹配的邮箱地址:", matches[0])
	}
}

匹配 URL

text := "这是一个链接文本:https://www.163.com 和 https://www.google.com"
re := regexp.MustCompile(`https?://[^\s]+`)
matches := re.FindAllString(text, -1)
for _, match := range matches {
	fmt.Println("匹配的链接:", match)
}

数字、汉字、拼音的匹配

reg1 := regexp.MustCompile(`[0-9]+`)      //正则 匹配数字
reg2 := regexp.MustCompile(`[\p{Han}]+`)  //正则 匹配汉字
reg3 := regexp.MustCompile(`[a-z]+`)      //正则 匹配拼音

通过 Find 匹配(传入[]byte,返回[]byte)

//----------- Find 使用 -----------------//
str := "ab001234hah120210a880218end"
reg := regexp.MustCompile("\\d{6}") //六位连续的数字
// 返回str中第一个匹配reg的字符串
data := reg.Find([]byte(str))
fmt.Println(string(data))

//----------- FindAll 使用 ---------------//
//返回 str中所有匹配reg的字符串, 第二个参数表示最多返回的个数,传-1表示返回所有结果
dataSlice := reg.FindAll([]byte(str), -1)
for _, v := range dataSlice {
	fmt.Println(string(v))
}

FindIndex 获取索引位

//------------- FindIndex ----------------//
str := "00start123endhahastart120PSend09start10000end"
// 返回第一个匹配的字符串的首末位置
reg := regexp.MustCompile("start\\d*end")  //start开始,end结束,中间全是数字
// index[0]表示开始位置,index[1]表示结束位置
index := reg.FindIndex([]byte(str))
fmt.Println("start:", index[0], ",end:", index[1], str[index[0]:index[1]])

//------------- FindAllIndex ----------------//
// 返回所有匹配的字符串首末位置
indexSlice := reg.FindAllIndex([]byte(str), -1)
for _, v := range indexSlice {
	fmt.Println("start:", v[0], ",end:", v[1], str[v[0]:v[1]])
}

FindString 操作更方便

//-----------FindString 和 FindAllString ----------------//
str := "ab001234hah120210a880218end"
reg := regexp.MustCompile("\\d{6}")     //六位连续的数字
fmt.Println(reg.FindString(str))
fmt.Println(reg.FindAllString(str, -1))
// 以下两个方法是类似的,获取索引位
fmt.Println(reg.FindStringIndex(str))
fmt.Println(reg.FindIndex([]byte(str)))

// 查找汉字
str1 := "hello中国hello世界和平hi好"
reg1 := regexp.MustCompile("[\\p{Han}]+")
fmt.Println(reg1.FindAllString(str1, -1))  // [中国 世界和平 好]

// 查找数字或小写字母
str2 := "HAHA00azBAPabc09FGabHY99"
reg2 := regexp.MustCompile("[\\d|a-z]+")
fmt.Println(reg2.FindAllString(str2, -1))  // [00az abc09 ab 99]

//----------- ReplaceAllString ----------------//
// 查找并替换
str3 := "Welcome for Beijing-Tianjin CRH train"
reg3 := regexp.MustCompile(" ")
fmt.Println(reg.ReplaceAllString(str3, "@")) //将空格替换为@字符
// Welcome@for@Beijing-Tianjin@CRH@train

常用匹配

   text := `Hello 世界!123 Go.`
   // 查找连续的小写字母
   reg := regexp.MustCompile(`[a-z]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1)  // 输出结果["ello" "o"]
   
   // 查找连续的非小写字母
   reg = regexp.MustCompile(`[^a-z]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))     // ["H" " 世界!123 G" "."]
  
   // 查找连续的单词字母
   reg = regexp.MustCompile(`[\w]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello" "123" "Go"]

   // 查找连续的非单词字母、非空白字符
   reg = regexp.MustCompile(`[^\w\s]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["世界!" "."]
   
   // 查找连续的大写字母
   reg = regexp.MustCompile(`[[:upper:]]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["H" "G"]

   // 查找连续的非 ASCII 字符
   reg = regexp.MustCompile(`[[:^ascii:]]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["世界!"]
   
   // 查找连续的标点符号
   reg = regexp.MustCompile(`[\pP]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["!" "."]

   // 查找连续的非标点符号字符
   reg = regexp.MustCompile(`[\PP]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello 世界" "123 Go"]

   // 查找连续的汉字
   reg = regexp.MustCompile(`[\p{Han}]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["世界"]
   
   // 查找连续的非汉字字符
   reg = regexp.MustCompile(`[\P{Han}]+`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello " "!123 Go."]
   
   // 查找 Hello 或 Go
   reg = regexp.MustCompile(`Hello|Go`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello" "Go"]
   
   // 查找行首以 H 开头,以空格结尾的字符串
   reg = regexp.MustCompile(`^H.*\s`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello 世界!123 "]
   
   // 查找行首以 H 开头,以空白结尾的字符串(非贪婪模式)
   reg = regexp.MustCompile(`(?U)^H.*\s`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello "]
   
   // 查找以 hello 开头(忽略大小写),以 Go 结尾的字符串
   reg = regexp.MustCompile(`(?i:^hello).*Go`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello 世界!123 Go"]
   
   // 查找 Go.
   reg = regexp.MustCompile(`\QGo.\E`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Go."]
   
   // 查找从行首开始,以空格结尾的字符串(非贪婪模式)
   reg = regexp.MustCompile(`(?U)^.* `)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello "]

   // 查找以空格开头,到行尾结束,中间不包含空格字符串
   reg = regexp.MustCompile(` [^ ]*$`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // [" Go."]

   // 查找“单词边界”之间的字符串
   reg = regexp.MustCompile(`(?U)\b.+\b`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello" " 世界!" "123" " " "Go"]

   // 查找连续 1 次到 4 次的非空格字符,并以 o 结尾的字符串
   reg = regexp.MustCompile(`[^ ]{1,4}o`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello" "Go"]
   
   // 查找 Hello 或 Go
   reg = regexp.MustCompile(`(?:Hell|G)o`)
   fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello" "Go"]
   
   // 查找 Hello 或 Go,替换为 Hellooo、Gooo
   reg = regexp.MustCompile(`(?PHell|G)o`)
   fmt.Printf("%q\n", reg.ReplaceAllString(text, "${n}ooo"))   // "Hellooo 世界!123 Gooo."

   // 交换 Hello 和 Go
   reg = regexp.MustCompile(`(Hello)(.*)(Go)`)
   fmt.Printf("%q\n", reg.ReplaceAllString(text, "$3$2$1"))   // "Go 世界!123 Hello."

   reg = regexp.MustCompile(`[\f\t\n\r\v\123\x7F\x{10FFFF}\\\^\$\.\*\+\?\{\}\(\)\[\]\|]`)
   fmt.Printf("%q\n", reg.ReplaceAllString("\f\t\n\r\v\123\x7F\U0010FFFF\\^$.*+?{}()[]|", "-"))

4. 总结

在Golang中,使用regexp包可以轻松实现各种文本操作。无论是从文本中提取信息还是进行验证,正则表达式都是编程中不可或缺的一部分。

到此这篇关于Golang中正则表达式语法及相关示例的文章就介绍到这了,更多相关Golang正则表达式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Go语言实现简单聊天系统

    使用Go语言实现简单聊天系统

    本文介绍了如何使用Go语言和WebSocket技术构建一个简单的多人聊天室系统,包括客户端连接管理、消息广播和并发处理,最后,通过编写main.go、hub.go和client.go等核心代码模块,具有一定的参考价值,感兴趣的可以了解一下
    2024-10-10
  • go标准库net/http服务端的实现示例

    go标准库net/http服务端的实现示例

    go的http标准库非常强大,本文主要介绍了go标准库net/http服务端,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-07-07
  • 一文带你使用golang手撸一个websocket中间件

    一文带你使用golang手撸一个websocket中间件

    这篇文章主要为大家详细介绍了如何使用golang手撸一个websocket中间件,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以参考一下
    2023-12-12
  • 用Go语言标准库实现Web服务之创建路由

    用Go语言标准库实现Web服务之创建路由

    在上一节中创建了项目,这篇文章主要介绍如何用Go语言标准库创建路由,文中有详细的代码示例,对大家的学习或工作有一定的帮助,感兴趣的同学可以参考下
    2023-05-05
  • Golang HashMap实现原理解析

    Golang HashMap实现原理解析

    HashMap是一种基于哈希表实现的键值对存储结构,它通过哈希函数将键映射到数组的索引位置,支持高效的插入、查找和删除操作,这篇文章主要介绍了Golang HashMap实现原理,需要的朋友可以参考下
    2025-04-04
  • Go语言实战之实现均衡器功能

    Go语言实战之实现均衡器功能

    这篇文章主要为大家详细介绍了如何利用Golang 实现一个简单的流浪均衡器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-04-04
  • golang 删除切片的某个元素及剔除切片内的零值方式

    golang 删除切片的某个元素及剔除切片内的零值方式

    这篇文章主要介绍了golang 删除切片的某个元素及剔除切片内的零值方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • Go与Redis实现分布式互斥锁和红锁

    Go与Redis实现分布式互斥锁和红锁

    这篇文章主要介绍了Go与Redis实现分布式互斥锁和红锁,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-09-09
  • go goth封装第三方认证库示例详解

    go goth封装第三方认证库示例详解

    这篇文章主要为大家介绍了go goth封装第三方认证库示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言实现多协程文件下载器的过程详解

    Go语言实现多协程文件下载器的过程详解

    这篇文章主要介绍了Go语言实现多协程文件下载器的相关资料,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-08-08

最新评论