go语言基础-----11-----正则表达式

2023-11-09

1 正则表达式介绍

正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具。虽然正则表达式比纯粹的文本匹配效率低,但是它却更灵活。按照它的语法规则,随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合。

Go语言通过regexp标准包为正则表达式提供了官方支持,如果你已经使用过其他编程语言提供的正则相关功能,那么你应该对Go语言版本的不会太陌生,但是它们之间也有一些小的差异,因为Go实现的是RE2标准,除了\C,详细的语法描述参考:http://code.google.com/p/re2/wiki/Syntax。

其实字符串处理我们可以使用strings包来进行搜索(Contains、Index)、替换(Replace)和解析(Split、Join)等操作,但是这些都是简单的字符串操作,他们的搜索都是大小写敏感,而且固定的字符串,如果我们需要匹配可变的那种就没办法实现了,当然如果strings包能解决你的问题,那么就尽量使用它来解决。因为他们足够简单、而且性能和可读性都会比正则好。

2 正则匹配规则图

参考官网: https://studygolang.com/pkgdoc。
在这里插入图片描述

2.1 例子1: 点号(.) 匹配任意类型。

package main

import (
	"fmt"
	"regexp"
)

func main(){
	buf := "abc azc a7c aac 888 a9c  tac"

	//1) 解释规则, 它会解析正则表达式,如果成功返回解释器
	reg1 := regexp.MustCompile(`a.c`)
	if reg1 == nil {
		fmt.Println("regexp err")
		return
	}

	//2) 根据规则提取关键信息
	result1 := reg1.FindAllStringSubmatch(buf, -1)
	fmt.Println("result1 = ", result1)

}

在这里插入图片描述

2.2 例子2:匹配a[0-9]c之间的数值。

package main

import (
	"fmt"
	"regexp"
)

func main(){

	buf := "abc azc a7c aac 888 a9c  tac"

	//1) 解释规则, 它会解析正则表达式,如果成功返回解释器
	reg1 := regexp.MustCompile(`a[0-9]c`)

	if reg1 == nil { //解释失败,返回nil
		fmt.Println("regexp err")
		return
	}

	//2) 根据规则提取关键信息
	result1 := reg1.FindAllStringSubmatch(buf, -1)
	fmt.Println("result1 = ", result1)

}

在这里插入图片描述

2.3 例子3:\d 匹配a[0-9]c之间的数值。

package main

import (
	"fmt"
	"regexp"
)

func main(){

	buf := "abc azc a7c aac 888 a9c  tac"

	//1) 解释规则, 它会解析正则表达式,如果成功返回解释器
	reg1 := regexp.MustCompile(`a\dc`)
	if reg1 == nil { //解释失败,返回nil
		fmt.Println("regexp err")
		return
	}

	//2) 根据规则提取关键信息
	result1 := reg1.FindAllStringSubmatch(buf, -1)
	fmt.Println("result1 = ", result1)
}

结果和例子2一样。

在这里插入图片描述

2.4 例子4:+匹配前一个字符的1次或多次。

package main

import (
	"fmt"
	"regexp"
)

func main(){

	buf := "43.14 567 agsdg 1.23 7. 8.9 1sdljgl 6.66 7.8   "

	//解释正则表达式, +匹配前一个字符的1次或多次
	reg := regexp.MustCompile(`\d+\.\d+`)
	if reg == nil {
		fmt.Println("MustCompile err")
		return
	}

	//提取关键信息
	//result := reg.FindAllString(buf, -1)
	result := reg.FindAllStringSubmatch(buf, -1)
	fmt.Println("result = ", result)
}

在这里插入图片描述

2.5 例子5:过滤带标签或不带标签的。

package main

import (
	"fmt"
	"regexp"
)

func main(){

	//``   原生字符串
	buf := `
     
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <title>Go语言标准库文档中文版 | Go语言中文网 | Golang中文社区 | Golang中国</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=no">
    <meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
    <meta charset="utf-8">
    <link rel="shortcut icon" href="/static/img/go.ico">
    <link rel="apple-touch-icon" type="image/png" href="/static/img/logo2.png">
    <meta name="author" content="polaris <polaris@studygolang.com>">
    <meta name="keywords" content="中文, 文档, 标准库, Go语言,Golang,Go社区,Go中文社区,Golang中文社区,Go语言社区,Go语言学习,学习Go语言,Go语言学习园地,Golang 中国,Golang中国,Golang China, Go语言论坛, Go语言中文网">
    <meta name="description" content="Go语言文档中文版,Go语言中文网,中国 Golang 社区,Go语言学习园地,致力于构建完善的 Golang 中文社区,Go语言爱好者的学习家园。分享 Go 语言知识,交流使用经验">
</head>
    <div>和爱好</div>
    <div>哈哈
    你在吗
    不在
    </div>
    <div>测试</div>
    <div>你过来啊</div>
 
<frameset cols="15,85">
    <frame src="/static/pkgdoc/i.html">
    <frame name="main" src="/static/pkgdoc/main.html" tppabs="main.html" >
    <noframes>
    </noframes>
</frameset>
</html>
    `

	//解释正则表达式, +匹配前一个字符的1次或多次
	//reg := regexp.MustCompile(`<div>(.*)</div>`)
	//.*表示匹配当前所有内容。此时当前即是<div></div>两者中的内容。*后面加上?后,即*?表示匹配重复的项,即若出现重复会只显示一次,越少越好。
	//?s::表示也匹配换行。
	reg := regexp.MustCompile(`<div>(?s:(.*?))</div>`)
	if reg == nil {
		fmt.Println("MustCompile err")
		return
	}

	//提取关键信息
	result := reg.FindAllStringSubmatch(buf, -1)
	//fmt.Println("result = ", result)

	//过滤<></>
	for _, text := range result {
		//过滤带标签的
		//fmt.Println("text[0] = ", text[0]) //带<></>
		//过滤不带标签的
		fmt.Println("text[1] = ", text[1]) //不带<></>
	}
}

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

go语言基础-----11-----正则表达式 的相关文章

  • Golang GAE - 小胡子结构中的 intID

    这是一个Example https www dropbox com sh ur2ws1jnik6euef PjVJSwDTUc Blog Golang zip该应用程序的 关键代码在 golang code handler handler
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 这两种方式哪一种是惯用的方式? time.Sleep() 还是自动收报机?

    我必须每分钟执行一些语句 我不确定我应该遵循以下哪一项 如果有人能解释内存和 CPU 方面的优缺点 那就太好了 时间 Sleep func main go func for time Sleep time Minute fmt Printl
  • GoLang ssh:尽管将其设置为 nil,但仍出现“必须指定 HosKeyCallback”错误

    我正在尝试使用 GoLang 连接到远程服务器 在客户端配置中 除了用户和密码之外 我将 HostKeyCallback 设置为 nil 以便它接受每个主机 config ssh ClientConfig User user HostKey
  • 为什么我不能将左大括号放在下一行?

    当我尝试编译以下代码时遇到奇怪的错误 package main import fmt fmt func main var arr 3 int for i 0 i lt 3 i fmt Printf d arr i 错误如下 unexpect
  • go中有memset的类似物吗?

    在 C 中 我可以使用某些值初始化数组memset https msdn microsoft com en us library aa246471 28v vs 60 29 aspx const int MAX 1000000 int is
  • 如何将 Unicode 字符转换为简单形式? [复制]

    这个问题在这里已经有答案了 有没有一个Go库可以Sj str m作为输入和返回Sjostrom作为输出 您可以使用golang org x text unicode norm来处理这个问题 package main import fmt i
  • “go.tools”的权限被拒绝错误

    当我尝试安装 go 工具时 我的权限被拒绝 usr local go pkg tool linux amd64 cover 我可以接受 因为它是 usr local 目录及需求root使用权 但我的第一个疑问是为什么当我设置时它试图安装在这
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 如何仅在测试时允许一个包访问另一个包的未导出数据?

    In Go 编程语言 第 11 2 4 节 有一个外部测试访问的示例fmt isSpace 通过声明IsSpace in fmt s export test go文件 这似乎是完美的解决方案 所以这就是我所做的 a a go package
  • 在 Visual Studio Code 中调试 Go 测试

    在我的 Windows 计算机上 我安装了 Visual Studio Code 要手动运行测试 我进入控制台到项目文件夹并输入 go test main test go 它工作完美 但我遇到一种情况 我需要调试我的测试以了解发生了什么 为
  • 如何在 Go 中填写 void* C 指针?

    我正在尝试与 Go 中的一些 C 代码交互 使用 cgo 这一直相对简单 直到我遇到这种 相当常见 的情况 需要将指针传递给本身包含指向某些数据的指针的结构 我似乎无法弄清楚如何从 Go 中做到这一点 而不诉诸于将结构的创建放入 C 代码本
  • 在复杂的文件夹结构中进行测试

    我正在 golang 中构建一个设计模式存储库 为了运行所有测试 我使用这个 bash 脚本 有用 bin bash go test creational abstract factory go go test creational bui
  • GoLang 中的 HTML 部分

    我刚刚开始使用 Go 我想用它创建一个网络应用程序 我现在尝试的是以handlebarsjs 式的方式使用模板 我想将页眉和页脚从主页中取出 以便可以将它们注入到每个网页上 我当前的设置应该是解析主页 页眉和页脚 HTML 文件并缓存它们
  • 指针上定义的方法仍然可以用值调用

    Effective Go 文档说明如下 关于接收者的指针与值的规则是 可以在指针和值上调用值方法 但只能在指针上调用指针方法 http tip golang org doc effective go html pointers vs val
  • 将中间件与 Golang Gorilla mux 子路由器结合使用

    如何将中间件应用到 Go 中大猩猩工具包 http www gorillatoolkit org 多路复用器子路由器 我有以下代码 router mux NewRouter StrictSlash true apiRouter router
  • 关于编写惯用的 Golang 的建议

    我正在掌握 Golang 的做事方式 首先是一些示例代码 package main import log os func logIt s string f os OpenFile errors log os O RDWR os O CREA
  • 为什么 DER ASN.1 大整数的解组在 Golang 中仅限于 SEQUENCE?

    我希望能够使用encoding asn1 包从 DER 文件中解组一个大整数 但它看起来只适用于整数序列 例如 这不起作用 这很奇怪 因为 Big Int 的编组效果很好 https play golang org p Wkj0jAA6bp
  • go json marshal 的默认大小写选项?

    我有以下结构要导出为 json type ExportedIncident struct Title string json title Host string json host Status string json status Dat
  • 从 Golang 调用 C 函数

    我想在 Golang 中编写控制器逻辑并处理 json 和数据库 同时在 C 中使用我的数学处理模型 在我看来 调用 C 函数的开销必须尽可能低 就像设置寄存器 rcx rdx rsi rdi 一样 执行一些操作fastcall 并获取 r

随机推荐

  • 基于SSM的北京集联软件科技有限公司信息管理系统

    末尾获取源码 开发语言 Java Java开发工具 JDK1 8 后端框架 SSM 前端 采用JSP技术开发 数据库 MySQL5 7和Navicat管理工具结合 服务器 Tomcat8 5 开发软件 IDEA Eclipse 是否Mave
  • SpringCloud五大核心组件

    Consul 等 提供了搭建分布式系统及微服务常用的工具 如配置管理 服务发现 断路器 智能路由 微代理 控制总线 一次性token 全局锁 选主 分布式会话和集群状态等 满足了构建微服务所需的所有解决方案 服务发现 Netflix Eur
  • tensorflow损失函数及实现

    在深度学习中 损失函数是 来衡量模型参数的质量的函数 衡量的 式是 较 络输出和真实输出的差异 损失函数在不同的 献中名称是不 样 的 主要有以下 种命名 式 1 分类任务 在深度学习的分类任务中使 最多的是交叉熵损失函数 所以在这 我们
  • cnpm 安装

    使用淘宝镜像cnpm替代npm 解决npm安装库慢 使用代理或者库镜像又比较麻烦 最好使用cnpm 1 cdm打开命令提示符 输入 npm install g cnpm registry https registry npm taobao
  • win11安装MySQL5.7.43的问题清单

    文章目录 1 win11查看自己电脑有没有安装mysql 法1 法2 2 完全清除之前安装的mysql 3 mysql的安装 法1 法2 4 遇到的一些问题 1 mysql 不是内部或外部命令 也不是可运行的程序或批处理文件 2 忘记mys
  • UMG创建暂停官方问题修正

    链接来自 https docs unrealengine com zh CN Engine UMG HowTo CreatePauseMenu index html 仍然有几个问题 和创建主菜单类似 就不一一解释了 1 暂停菜单 2 人物蓝
  • Java的API帮助文档

    JDK帮助文档 SUN公司为JDK工具包提供了一整套文档资料 我们习惯上称之为JDK文档 JDK文档中提供了Java中的各种技术的详细资料 以及JDK中提供的各种类的帮助说明 JDk文档是Java语言的完整说明 大多数书籍中的类的介绍都要参
  • 什么是真正的实时操作系统

    转自 http club topsage com thread 513248 1 1 html 1 首先说一下实时的定义及要求 参见 Donal Gillies 在 Realtime Computing FAQ 中提出定义 实时系统指系统的
  • [Atcoder ABC222] F - Expensive Expense

    Time Limit 4 sec Memory Limit 1024 MB Score 500 points Problem Statement The Kingdom of AtCoder is composed of N N N tow
  • python+Django的web开发实例

    一 创建一个项目 如果这是你第一次使用Django 那么你必须进行一些初始设置 也就是通过自动生成代码来建立一个Django项目 一个Django项目的设置集 包含了数据库配置 Django详细选项设置和应用 特性配置 具体操作步骤如下所示
  • TaiShan 200服务器安装Ubuntu 18.04

    TaiShan 200服务器安装Ubuntu 18 04 0 镜像下载 1 准备工作 1 1 软件硬件环境准备 1 2 组网规划 1 3 磁盘分区规划 1 4 可选 RAID配置 2 通过光驱安装Ubuntu 18 04 0 镜像下载 ub
  • 峰值电流模式Buck控制器

    图1 7 1峰值电流模式Buck Converter方块图 图1 7 1包含两个回路 分别是外回路 电压控制回路 和内回路 电感电流控制回路 外回路 电压控制回路 此回路类似与输出电压控制模式类似 Vcomp为输出电压与基准电压通过比较器而
  • Android Studio 中使用uiautomatorviewer插件

    1 综述 Android Studio是Google官方提供的一款用于开发Android应用程序的集成开发环境 IDE 它基于IntelliJ IDEA开发而来 为开发者提供了完整的工具链 包括代码编写 调试 测试 性能优化等 Androi
  • C++实现MySQL数据库连接池

    C 实现MySQL数据库连接池 涉及技术 MySQL数据库编程 单例模式 STL容器 C 11多线程 线程互斥 线程互斥 线程同步通信和unique lock 智能指针shared ptr lambda表达式 生产者 消费者线程模型 项目背
  • 职场日常:测试常用测试工具盘点,你用过几个?

    测试工具永远是软件测试人员的得力助手 不能完全依赖工具 但也不能没有工具 在学习软件过程中 要著中软件测试工具的使用 1 测试管理工具 禅道 简单好用 市场主流 互联网行业居多 Jira 简单好用 bugzilla 功能简单 svn 代码和
  • StringBuffer简单使用

    StringBuffer简单使用 一 简介 StringBuffer 是可以存储和操作字符串 即包含多个字符的字符串数据 String类是字符串常量 是不可更改的常量 而StringBuffer是字符串变量 它的对象是可以扩充和修改的 St
  • 【Linux】如何在Linux下提交代码到gittee

    文章目录 使用 git 命令行 创建项目 三板斧第一招 git add 三板斧第二招 git commit 三板斧第三招 git push 其他几个重要的命令 git pull 将远端同步到本地 git rm 删除 git log 查看提交
  • 如何让 useEffect 支持 async/await?

    大家在使用 useEffect 的时候 假如回调函数中使用 async await 的时候 会报错如下 看报错 我们知道 effect function 应该返回一个销毁函数 return返回的 cleanup 函数 如果 useEffec
  • linux 查看运行进程的可执行文件所在目录

    1 获取PID 方法1 执行top命令 然后找到对应的进程 方法2 执行ps ef grep 程序名 2 进入proc目录下对应的进程路径 cd proc 3 sudo ls l user为root的进程需要sudo权限 exe连接的即可执
  • go语言基础-----11-----正则表达式

    1 正则表达式介绍 正则表达式是一种进行模式匹配和文本操纵的复杂而又强大的工具 虽然正则表达式比纯粹的文本匹配效率低 但是它却更灵活 按照它的语法规则 随需构造出的匹配模式就能够从原始文本中筛选出几乎任何你想要得到的字符组合 Go语言通过r