设为首页收藏本站
网站公告 | 这是第一条公告
     

 找回密码
 立即注册
缓存时间23 现在时间23 缓存数据 好好的睡一觉吧,闭上眼睛做个好梦,明天睁眼又会是美好的一天,晚安好梦。

好好的睡一觉吧,闭上眼睛做个好梦,明天睁眼又会是美好的一天,晚安好梦。

查看: 1373|回复: 3

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

[复制链接]

  离线 

TA的专栏

  • 打卡等级:热心大叔
  • 打卡总天数:204
  • 打卡月天数:0
  • 打卡总奖励:3215
  • 最近打卡:2023-08-27 04:16:19
等级头衔

等級:晓枫资讯-上等兵

在线时间
0 小时

积分成就
威望
0
贡献
440
主题
394
精华
0
金钱
4486
积分
856
注册时间
2022-12-25
最后登录
2025-3-15

发表于 2024-5-14 16:48:32 | 显示全部楼层 |阅读模式
目录


  • 1. Golang中的正则表达式包
  • 2. 正则表达式语法简述
  • 3. 相关示例
  • 4. 总结

1. Golang中的正则表达式包

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

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

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

2. 正则表达式语法简述

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

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

3. 相关示例

邮箱匹配
  1. package main

  2. import (
  3. "fmt"
  4. "regexp"
  5. )

  6. func main() {
  7.         text := "邮箱是 demo@qq.com 。"
  8.         re := regexp.MustCompile(`[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}`)
  9.         matches := re.FindStringSubmatch(text)
  10.         if len(matches) > 0 {
  11.                 fmt.Println("匹配的邮箱地址:", matches[0])
  12.         }
  13. }
复制代码
匹配 URL
  1. text := "这是一个链接文本:https://www.163.com 和 https://www.google.com"
  2. re := regexp.MustCompile(`https?://[^\s]+`)
  3. matches := re.FindAllString(text, -1)
  4. for _, match := range matches {
  5.         fmt.Println("匹配的链接:", match)
  6. }
复制代码
数字、汉字、拼音的匹配
  1. reg1 := regexp.MustCompile(`[0-9]+`)      //正则 匹配数字
  2. reg2 := regexp.MustCompile(`[\p{Han}]+`)  //正则 匹配汉字
  3. reg3 := regexp.MustCompile(`[a-z]+`)      //正则 匹配拼音
复制代码
通过 Find 匹配(传入[]byte,返回[]byte)
  1. //----------- Find 使用 -----------------//
  2. str := "ab001234hah120210a880218end"
  3. reg := regexp.MustCompile("\\d{6}") //六位连续的数字
  4. // 返回str中第一个匹配reg的字符串
  5. data := reg.Find([]byte(str))
  6. fmt.Println(string(data))

  7. //----------- FindAll 使用 ---------------//
  8. //返回 str中所有匹配reg的字符串, 第二个参数表示最多返回的个数,传-1表示返回所有结果
  9. dataSlice := reg.FindAll([]byte(str), -1)
  10. for _, v := range dataSlice {
  11.         fmt.Println(string(v))
  12. }
复制代码
FindIndex 获取索引位
  1. //------------- FindIndex ----------------//
  2. str := "00start123endhahastart120PSend09start10000end"
  3. // 返回第一个匹配的字符串的首末位置
  4. reg := regexp.MustCompile("start\\d*end")  //start开始,end结束,中间全是数字
  5. // index[0]表示开始位置,index[1]表示结束位置
  6. index := reg.FindIndex([]byte(str))
  7. fmt.Println("start:", index[0], ",end:", index[1], str[index[0]:index[1]])

  8. //------------- FindAllIndex ----------------//
  9. // 返回所有匹配的字符串首末位置
  10. indexSlice := reg.FindAllIndex([]byte(str), -1)
  11. for _, v := range indexSlice {
  12.         fmt.Println("start:", v[0], ",end:", v[1], str[v[0]:v[1]])
  13. }
复制代码
FindString 操作更方便
  1. //-----------FindString 和 FindAllString ----------------//
  2. str := "ab001234hah120210a880218end"
  3. reg := regexp.MustCompile("\\d{6}")     //六位连续的数字
  4. fmt.Println(reg.FindString(str))
  5. fmt.Println(reg.FindAllString(str, -1))
  6. // 以下两个方法是类似的,获取索引位
  7. fmt.Println(reg.FindStringIndex(str))
  8. fmt.Println(reg.FindIndex([]byte(str)))

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

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

  17. //----------- ReplaceAllString ----------------//
  18. // 查找并替换
  19. str3 := "Welcome for Beijing-Tianjin CRH train"
  20. reg3 := regexp.MustCompile(" ")
  21. fmt.Println(reg.ReplaceAllString(str3, "@")) //将空格替换为@字符
  22. // Welcome@for@Beijing-Tianjin@CRH@train
复制代码
常用匹配
  1.    text := `Hello 世界!123 Go.`
  2.    // 查找连续的小写字母
  3.    reg := regexp.MustCompile(`[a-z]+`)
  4.    fmt.Printf("%q\n", reg.FindAllString(text, -1)  // 输出结果["ello" "o"]
  5.    
  6.    // 查找连续的非小写字母
  7.    reg = regexp.MustCompile(`[^a-z]+`)
  8.    fmt.Printf("%q\n", reg.FindAllString(text, -1))     // ["H" " 世界!123 G" "."]
  9.   
  10.    // 查找连续的单词字母
  11.    reg = regexp.MustCompile(`[\w]+`)
  12.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello" "123" "Go"]

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

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

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

  30.    // 查找连续的汉字
  31.    reg = regexp.MustCompile(`[\p{Han}]+`)
  32.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["世界"]
  33.    
  34.    // 查找连续的非汉字字符
  35.    reg = regexp.MustCompile(`[\P{Han}]+`)
  36.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello " "!123 Go."]
  37.    
  38.    // 查找 Hello 或 Go
  39.    reg = regexp.MustCompile(`Hello|Go`)
  40.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello" "Go"]
  41.    
  42.    // 查找行首以 H 开头,以空格结尾的字符串
  43.    reg = regexp.MustCompile(`^H.*\s`)
  44.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello 世界!123 "]
  45.    
  46.    // 查找行首以 H 开头,以空白结尾的字符串(非贪婪模式)
  47.    reg = regexp.MustCompile(`(?U)^H.*\s`)
  48.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello "]
  49.    
  50.    // 查找以 hello 开头(忽略大小写),以 Go 结尾的字符串
  51.    reg = regexp.MustCompile(`(?i:^hello).*Go`)
  52.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello 世界!123 Go"]
  53.    
  54.    // 查找 Go.
  55.    reg = regexp.MustCompile(`\QGo.\E`)
  56.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Go."]
  57.    
  58.    // 查找从行首开始,以空格结尾的字符串(非贪婪模式)
  59.    reg = regexp.MustCompile(`(?U)^.* `)
  60.    fmt.Printf("%q\n", reg.FindAllString(text, -1))   // ["Hello "]

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

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

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

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

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

在Golang中,使用
  1. regexp包
复制代码
可以轻松实现各种文本操作。无论是从文本中提取信息还是进行验证,正则表达式都是编程中不可或缺的一部分。
到此这篇关于Golang中正则表达式语法及相关示例的文章就介绍到这了,更多相关Golang正则表达式内容请搜索晓枫资讯以前的文章或继续浏览下面的相关文章希望大家以后多多支持晓枫资讯!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
晓枫资讯-科技资讯社区-免责声明
免责声明:以上内容为本网站转自其它媒体,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。
      1、注册用户在本社区发表、转载的任何作品仅代表其个人观点,不代表本社区认同其观点。
      2、管理员及版主有权在不事先通知或不经作者准许的情况下删除其在本社区所发表的文章。
      3、本社区的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,举报反馈:点击这里给我发消息进行删除处理。
      4、本社区一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
      5、以上声明内容的最终解释权归《晓枫资讯-科技资讯社区》所有。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
20
积分
20
注册时间
2022-12-27
最后登录
2022-12-27

发表于 2024-9-11 07:43:07 | 显示全部楼层
感谢楼主,顶。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
11
积分
2
注册时间
2024-4-14
最后登录
2024-4-14

发表于 2024-11-24 07:19:49 | 显示全部楼层
感谢楼主分享。
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~

  离线 

TA的专栏

等级头衔

等級:晓枫资讯-列兵

在线时间
0 小时

积分成就
威望
0
贡献
0
主题
0
精华
0
金钱
17
积分
14
注册时间
2022-12-26
最后登录
2022-12-26

发表于 2025-4-18 21:45:32 | 显示全部楼层
顶顶更健康!!!
http://bbs.yzwlo.com 晓枫资讯--游戏IT新闻资讯~~~
严禁发布广告,淫秽、色情、赌博、暴力、凶杀、恐怖、间谍及其他违反国家法律法规的内容。!晓枫资讯-社区
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1楼
2楼
3楼
4楼

手机版|晓枫资讯--科技资讯社区 本站已运行

CopyRight © 2022-2025 晓枫资讯--科技资讯社区 ( BBS.yzwlo.com ) . All Rights Reserved .

晓枫资讯--科技资讯社区

本站内容由用户自主分享和转载自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

如有侵权、违反国家法律政策行为,请联系我们,我们会第一时间及时清除和处理! 举报反馈邮箱:点击这里给我发消息

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表