本文地址: https://www.cnblogs.com/zichliang/p/17387436.html

Golang日库合集:https://www.cnblogs.com/zichliang/category/2297320.html

简介

正则表达式是一种用来查询、匹配或替换字符串的技术。你可以使用它来找到符合特定模式的文本、删除或替换匹配的字符串。它可以用于各种编程语言和工具中,如Perl、Python、JavaScript、Java等等。

一句话概括就是,“正则表达式可以帮你快速、简便地处理需要查找、匹配或替换的文本内容,它可以大大提高程序的效率。”

正则介绍

正则表达式通常可以分为以下几个步骤:

  1. 定义正则表达式模式:即给出需要匹配或查找的文本规则,如匹配所有以"A"开头的单词,模式可以是 "^A\w+"。
  2. 编译正则表达式:将正则表达式模式编译成程序可识别的格式。
  3. 指定匹配文本:输入需要进行匹配操作的文本,如一段英语文章。
  4. 进行匹配操作:程序会根据输入的正则表达式和匹配文本进行匹配操作,搜索所有与正则表达式模式匹配的子串。
  5. 获取匹配结果:输出匹配到的所有子串,包括位置、长度,或将它们替换成所需要的格式。

元字符

上文说的第一步与第二步匹配特定字符或字符类型的字符在正则表达式中具有特殊含义。一般来说,它们都是特殊符号或字母,用于匹配某个字符类或执行某种操作。

这里就不列举了

推荐个网站: 里面包含了基本上所有的元字符: https://www.runoob.com/regexp/regexp-metachar.html

Golang中的正则

其实非常简单主要分为三步

  1. 正则( 针对字符串匹配规则)
  2. 元字符(基本上大同小异)
  3. 方法(特定语言有特定方法)

Golang 中常用的元字符:

  • .:匹配任意单个字符,除了换行符和回车符。
  • ^:匹配输入字符串的开始位置。
  • $:匹配输入字符串的结束位置。
  • *:匹配前面的字符(包括字符类)零次或多次。
  • +:匹配前面的字符(包括字符类)一次或多次。
  • ?:匹配前面的字符(包括字符类)零次或一次。
  • |:分隔两个可选模式,匹配任意一个模式。
  • []:匹配其中的任意一个字符。可以使用短横线表示范围,如 [a-z] 表示匹配任意小写字母。
  • \d:匹配任意一个数字字符,相当于 [0-9]。
  • \w:匹配任意一个字母、数字或下划线,相当于 [a-zA-Z0-9_]。
  • \s:匹配任意一个空白字符,包括空格、制表符、换行符等。

Golang中的函数和方法介绍

在 Golang 中,标准库 regexp 提供了一系列正则操作函数,下面是这些函数的简要介绍:

  • Compile(expr string) (*Regexp, error):将一个字符串编译成一个正则表达式对象 Regexp。如果编译失败,会返回一个非 nil 的错误对象。
  • CompilePOSIX(expr string) (*Regexp, error):类似于 Compile 函数,但是将正则表达式解释为 POSIX 语法。
  • MustCompile(expr string) *Regexp:类似于 Compile 函数,但是在编译失败时会直接抛出一个 panic。
  • MustCompilePOSIX(expr string) *Regexp:类似于 MustCompile 函数,但是将正则表达式解释为 POSIX 语法。
  • Match(pattern string, b []byte) (bool, error):判断一个字节数组中是否包含指定的正则表达式。
  • MatchString(pattern string, s string) (bool, error):判断一个字符串中是否包含指定的正则表达式。
  • MatchReader(pattern string, r io.RuneReader) (bool, error):类似于 Match 函数,但是适用于 io.RuneReader 类型。
  • MatchRegexp(r *Regexp, s string) bool:对一个字符串执行已编译的正则表达式对象 Regexp 进行匹配。
  • MatchReaderRegexp(r *Regexp, r io.RuneReader) bool:类似于 MatchRegexp 函数,但是适用于 io.RuneReader 类型。
  • QuoteMeta(s string) string:将一个字符串中的元字符以外的所有字符都转义,使它们成为字面量。

除此之外,Regexp 对象还提供了一系列操作方法,例如:

  • Find(b []byte) []byte:返回第一个匹配的子字符串。
  • FindAll(b []byte, n int) [][]byte:返回所有匹配的子字符串,n 表示最大匹配次数。
  • FindAllIndex(b []byte, n int) [][]int:返回所有匹配的子字符串的起止索引,n 表示最大匹配次数。
  • FindIndex(b []byte) (loc []int):返回第一个匹配的子字符串的起止索引。
  • FindString(s string) string:返回第一个匹配的子字符串。
  • FindAllString(s string, n int) []string:返回所有匹配的子字符串,n 表示最大匹配次数。
  • FindAllStringIndex(s string, n int) [][]int:返回所有匹配的子字符串的起止索引,n 表示最大匹配次数。
  • FindStringIndex(s string) (loc []int):返回第一个匹配的子字符串的起止索引。
  • FindAllSubmatch(b []byte, n int) [][][]byte 返回的是字节切片的切片的切片
  • FindAllSubmatchIndex(b []byte, n int) [][]int 返回所有匹配子串的开始和结束的字符索引位置。
  • FindAllStringSubmatch(s string, n int) [][]string 返回的是字符串切片的切片的切片。
  • FindAllStringSubmatchIndex(s string, n int) [][]int 返回各个子串的开始和结束的索引值,
  • ReplaceAll(src []byte, repl []byte) []byte:将 src 中的所有匹配项替换为 repl,返回替换后的结果。
  • ReplaceAllString(src, repl string) string:类似于 ReplaceAll 函数,但是输入输出都是字符串类型。
  • Split(s string, n int) []string:将 s 按照正则表达式分割,n 表示最大分割次数。
  • SplitN(s string, n int) []string:类似于 Split 函数,但是只分割前 n 个子字符串。

这些函数和方法可以满足我们对正则表达式进行各种查询、替换、分割等常见操作的需求。

示例

Compile 和 MustCompile

在 Golang 中,我们可以使用 Compile 函数和 MustCompile 函数来将正则表达式字符串编译为一个 Regexp 对象。

这两个函数的作用是相同的,都是将正则表达式字符串编译成一个正则表达式对象,只不过 MustCompile 函数在编译失败时会直接抛出一个 panic。

Compile

// Compile 函数的使用方式
re, err := regexp.Compile(`\d+`)
if err != nil {
// 正则表达式编译失败
return
}
// 使用编译后的正则表达式对象
fmt.Println(re.MatchString("123"))

结果

true

MustCompile

// MustCompile 函数的使用方式
re = regexp.MustCompile(`\d+`)
fmt.Println(re.MatchString("456"))

结果

true

FindAllSubmatch和FindAllStringSubmatch

FindAllSubmatch 方法是 Golang 中 Regexp 对象提供的一个方法。

用于在指定字符串中查找所有符合正则表达式规则的子字符串,并返回子字符串所对应的分组信息及匹配位置。

其函数签名如下:

func (re *Regexp) FindAllSubmatch(b []byte, n int) [][][]byte
func (re *Regexp) FindAllSubmatchIndex(b []byte, n int) [][]int
func (re *Regexp) FindAllStringSubmatch(s string, n int) [][]string
func (re *Regexp) FindAllStringSubmatchIndex(s string, n int) [][]int

FindAllSubmatch 和 FindAllStringSubmatch 方法都用于在字符串中查找所有匹配正则表达式的子字符串,它们返回的是一个包含所有匹配子串和索引位置的二维切片。

FindAllStringSubmatchIndex 方法返回一个二维的整数切片,每个子切片表示一次匹配,每个子切片中的两个整数分别表示匹配子串在源字符串中的开始和结束位置的索引。

FindAllSubmatchIndex 方法也返回一个二维的整数切片,不同的是,每个子切片中都包含一系列整数,每两个整数表示匹配的一组子表达式在源字符串中的开始和结束位置的索引。

其实说的还是有些笼统 直接看例子

package main

import (
"fmt"
"regexp"
"strings"
) func main() {
content := `111 aba 1024 bbb 2048 ccc aba aba`
pattern := `aba`
compile, _ := regexp.Compile(pattern)
results := compile.FindAllSubmatch([]byte(content), -1)
fmt.Println(compile.FindAllSubmatchIndex([]byte(content), -1))
for _, result := range results {
fmt.Println("FindAllSubmatch>>>>>", result)
fmt.Println("FindAllSubmatch>>>>>", result[0])
fmt.Println("FindAllSubmatch>>>>>", string(result[0]))
}
fmt.Println(strings.Repeat("*", 100))
results1 := compile.FindAllStringSubmatch(content, -1)
fmt.Println(compile.FindAllStringSubmatchIndex(content, -1))
for _, result := range results1 {
fmt.Println("FindAllStringSubmatch>>>>>", result)
fmt.Println("FindAllStringSubmatch>>>>>", result[0])
}
}

结果如下:

例子2:

如果我们需要正则提取网站该如何实现呢?

package main

import (
"fmt"
"regexp"
"strings"
) func main() {
content := `<a href="https://www.jd.com" target="_blank">京东</a> <a href="https://www.taobao.com" target="_blank">淘宝</a>`
pattern := `<a href="(.*?)" target="_blank">(.*?)</a>`
compile, _ := regexp.Compile(pattern)
results := compile.FindAllSubmatch([]byte(content), -1) /*
[][][]byte []byte="" // 一旦加了括号等于分了组 后面会向这个切片追加值,所以下文只要切片取第二个值就行了 多分组就以此类推
[
[<a href="https://www.jd.com" target="_blank">京东</a>,https://www.jd.com,京东]
[<a href="https://www.taobao.com" target="_blank">淘宝</a>,https://www.taobao.com,淘宝]
]
*/
for _, result := range results {
fmt.Println(strings.Repeat("*", 100))
fmt.Println(string(result[0]), string(result[1]), string(result[2]))
} }

结果

本文地址: https://www.cnblogs.com/zichliang/p/17387436.html

Golang日库合集:https://www.cnblogs.com/zichliang/category/2297320.html

Golang每日一库之regex的更多相关文章

  1. Golang每日一库之bcrypt

    本文 官方文档: https://pkg.go.dev/golang.org/x/crypto/bcrypt 前言 之前讲过JWT Token https://www.cnblogs.com/zich ...

  2. Go 每日一库之 go-carbon,优雅的golang日期时间处理库

    Carbon 是一个轻量级.语义化.对开发者友好的 golang 时间处理库,支持链式调用. Carbon 已被 awesome-go 收录, 如果您觉得不错,请给个 star 吧. github.c ...

  3. Go 每日一库之 flag

    缘起 我一直在想,有什么方式可以让人比较轻易地保持每日学习,持续输出的状态.写博客是一种方式,但不是每天都有想写的,值得写的东西. 有时候一个技术比较复杂,写博客的时候经常会写着写着发现自己的理解有偏 ...

  4. Golang实现requests库

    Golang实现requests库 简单的封装下,方便使用,像python的requests库一样. Github地址 Github 支持 GET.POST.PUT.DELETE applicatio ...

  5. Golang 的 TOML库

    TOML 的全称是 Tom's Obvious, Minimal Language,因为它的作者是 GitHub 联合创始人 Tom Preston-Werner. TOML 的目标是成为一个极简的配 ...

  6. 『Golang』—— 标准库之 os

    Golang 的 os 库基本承袭 Unix 下 C 语言的用法 path 库: func Base(path string) string //取文件名,不含目录部分 func Dir(path s ...

  7. Go 每日一库之 viper

    简介 上一篇文章介绍 cobra 的时候提到了 viper,今天我们就来介绍一下这个库. viper 是一个配置解决方案,拥有丰富的特性: 支持 JSON/TOML/YAML/HCL/envfile/ ...

  8. Go 每日一库之 fsnotify

    简介 上一篇文章Go 每日一库之 viper中,我们介绍了 viper 可以监听文件修改进而自动重新加载. 其内部使用的就是fsnotify这个库,它是跨平台的.今天我们就来介绍一下它. 快速使用 先 ...

  9. Golang编写动态库实现回调函数

    Golang编写动态库实现回调函数 我们现在要做一个动态库,但是C++实在是比较难,于是就想能不能用更简单的golang来实现,golang也就是最近的版本才支持编译成动态库,在网上也没找到可用的案例 ...

  10. golang命令行库cobra的使用

    简介 Cobra既是一个用来创建强大的现代CLI命令行的golang库,也是一个生成程序应用和命令行文件的程序.下面是Cobra使用的一个演示: Cobra提供的功能 简易的子命令行模式,如 app ...

随机推荐

  1. 日志注解,基于ruoyi的后置切面改进而来

    有次接口响应时间太长,想知道具体接口执行的时间是多少,于是决定通过注解来实现这个想法,刚好ruoyi本身就提供了完善的日志注解,虽然是采用后置通知,但是完全不影响我们改造它. 想要实现接口耗时的功能, ...

  2. Unity_飞机大战记录总结

    记录步骤:win+R→PSR.exe 一.竖屏设置 分辨率设为9:16 二.主控脚本 添加一个空节点,命名"游戏主控" 新建游戏的主控脚本,命名为MyGame.cs,方便管理(即, ...

  3. gongwen

    gongwen 学号 姓名 工作占比 20201307 梁辰鱼 20% 20201323 谭顺心 17% 20201222 龚 杰 16.5% 20201325 夏俊睿 16% 20201317 鲁永 ...

  4. Unity 2D Sprite 俯视角渲染顺序设置

    今天结合网上的一个教程复习了一下Unity中2D俯视角游戏的渲染顺序设置. 首先是在Hierachy中的摆放顺序,靠下的物体渲染顺序靠后: 然后是Sprite Renderer组件,可以通过组件中的S ...

  5. 【Leetcode】 剑指offer:栈与队列 --Day01

    写在前面 2023届秋招形势严峻,作为2024届本科生倍感压力.时间紧迫,需要加快脚步. 计划之一是在未来的36天时间里通关Leetcode的剑指offer系列算法题.这一系列的学习周期为31天,也就 ...

  6. swiper常见问题、动态加载数据问题

    swiper加载静态文件是没有问题的 swiper加载动态文件需要在请求后再加载这个函数 参考链接:  https://blog.csdn.net/webzrh/article/details/781 ...

  7. mysql5.7主从搭建过程

    1.下载程序包 mysql-5.7.33-linux-glibc2.12-x86_64.tar.gz ,解压至/opt/app/mysql2.配置/etc/my.cnf[mysql]socket=/o ...

  8. .net core mvc中session的应用

    1.首先新建一个空的web项目,在Program.cs中打开和使用session public class Program { public static void Main(string[] arg ...

  9. Cesium渲染模块之Command

    1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库,使用WebGL来进行硬件加速图形,使用时不需要任何插件支持,基于Apache2.0许可的开源程序,可以免费用于商业和非商业 ...

  10. 声网自研传输层协议 AUT 的落地实践丨Dev for Dev 专栏

    本文为「Dev for Dev 专栏」系列内容,作者为声网大后端传输协议负责人 夏天. 针对实时互动应用对网络传输带来的新需求和新挑战,声网通过将实时互动中的应用层业务需求与传输策略的分层和解耦,于 ...