Golang每日一库之regex

这篇具有很好参考价值的文章主要介绍了Golang每日一库之regex。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文地址: https://www.cnblogs.com/zichliang/p/17387436.html
Golang日库合集:https://www.cnblogs.com/zichliang/category/2297320.html文章来源地址https://www.toymoban.com/news/detail-437876.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 方法也返回一个二维的整数切片,不同的是,每个子切片中都包含一系列整数,每两个整数表示匹配的一组子表达式在源字符串中的开始和结束位置的索引。

其中,re 是一个正则表达式对象,b 是需要查找匹配的字节切片,n 表示最大匹配次数,如果为 -1 则表示查找所有匹配项。

返回值是一个二维切片,每个元素都是一个切片,包含所有匹配到的子串的字节切片,以及子串出现的索引位置。

其实说的还是有些笼统

例子

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])
	}
}

结果如下:
Golang每日一库之regex

例子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]))
	}

}

结果
Golang每日一库之regex

本文地址: https://www.cnblogs.com/zichliang/p/17387436.html
Golang日库合集:https://www.cnblogs.com/zichliang/category/2297320.html

到了这里,关于Golang每日一库之regex的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 每日一库:pprof简介

    pprof 是Go语言的一个性能分析库,它可以帮助开发者找出程序中的性能瓶颈。 pprof 提供了CPU分析、内存分析、阻塞分析等多种性能分析功能。 以下是 pprof 的主要特性: CPU分析 : pprof 可以记录程序在CPU上的运行时间,并将这些数据以火焰图的形式展示出来。这可以帮助开发

    2024年02月10日
    浏览(84)
  • 每日一库:Prometheus

    Prometheus 是一个开源的系统监控和警报工具,最初由 SoundCloud 开发,并于 2012 年发布为开源项目。它是一个非常强大和灵活的工具,用于监控应用程序和系统的性能,并根据预定义的规则触发警报。以下是对 Prometheus 的详细介绍: 多维数据模型: Prometheus 使用多维数据模型来

    2024年02月08日
    浏览(80)
  • 每日一库:fsnotify简介

    fsnotify 是一个用Go编写的文件系统通知库。它提供了一种观察文件系统变化的机制,例如文件的创建、修改、删除、重命名和权限修改。它使用特定平台的事件通知API,例如Linux上的inotify,macOS上的FSEvents,以及Windows上的ReadDirectoryChangesW。 fsnotify 具有以下特点: 跨平台支持

    2024年02月11日
    浏览(41)
  • 每日一库:cobra 简介

    当你需要为你的 Go 项目创建一个强大的命令行工具时,你可能会遇到许多挑战,比如如何定义命令、标志和参数,如何生成详细的帮助文档,如何支持子命令等等。为了解决这些问题, github.com/spf13/cobra 就可以派上用场。 github.com/spf13/cobra 是一个用于构建强大的命令行应用程

    2024年02月08日
    浏览(48)
  • 每日一库:gosec

    gosec 是一个用于在 Go 代码中查找安全问题的开源工具,它可以帮助发现可能的漏洞和潜在的安全风险。以下是关于 gosec 的详细介绍: gosec 是一个静态分析工具,用于扫描 Go 代码以查找潜在的安全问题。它可以识别常见的代码漏洞、敏感信息泄露和其他安全问题,帮助开发人

    2024年02月12日
    浏览(44)
  • 每日一库:lumberjack -- 日志轮换和管理

    在开发应用程序时,记录日志是一项关键的任务,以便在应用程序运行时追踪问题、监视性能和保留审计记录。Go 语言提供了灵活且强大的日志记录功能,可以通过多种方式配置和使用。其中一个常用的日志记录库是 github.com/natefinch/lumberjack ,它提供了一个方便的方式来处理

    2024年02月08日
    浏览(45)
  • Golang标准库之bytes介绍

    本次主要介绍golang中的标准库 bytes ,基本上参考了 字节 | bytes 、Golang标准库——bytes 文章。 bytes 库主要包含 5 大部分,即: 常量 变量 函数 Buffer Reader 我们依次学习上面的 5 大部分。 bytes.MinRead 是一个常量,表示在使用 ReadFrom 方法从 io.Reader 中读取数据时,每次读取的最小

    2024年02月07日
    浏览(61)
  • golang常用库之-golang-jwt/jwt包

    github: https://github.com/golang-jwt/jwt golang-jwt/jwt 是一个在 Go 语言中使用 JSON Web Tokens(JWT)进行身份验证和授权的库。JWT 是一种用于在跨网络进行安全通信的开放标准(RFC 7519),它使用一个 JSON 对象来表示被声明的安全性信息。 golang-jwt/jwt 包提供了创建、解析和验证 JWT 的功能

    2024年01月23日
    浏览(37)
  • 7天玩转 Golang 标准库之 http/net

    在构建web应用时,我们经常需要处理HTTP请求、做网页抓取或者搭建web服务器等任务,而Go语言在这方面为我们提供了强大的内置工具:net/http标准库,它为我们操作和处理HTTP协议提供了便利。 首先,我们来看看如何使用net/http标准库发送一个HTTP请求。net/http库中的 http.Get 函数

    2024年02月04日
    浏览(51)
  • 【微信小程序】如何获得自己当前的定位呢?本文利用逆地址解析、uni-app带你实现

    目录 前言 效果展示 一、在腾讯定位服务配置微信小程序JavaScript SDK 二、使用uni-app获取定位的经纬度 三、 逆地址解析,获取精确定位 四、小提示 在浏览器搜索腾讯定位服务,找到官方网站,利用微信或者其他账号注册登录,登录后如下图操作 点进去之后,可以看到如下图

    2024年01月19日
    浏览(87)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包