非零基础自学Golang 第16章 正则表达式 16.3 regexp包 16.4 小结 16.5 知识拓展

news/2024/10/24 22:53:32/

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第16章 正则表达式
        • 16.3 regexp包
          • 16.3.1 MatchString函数
          • 16.3.2 FindStringIndex函数
          • 16.3.3 ReplaceAllString函数
        • 16.4 小结
        • 16.5 知识拓展
          • 16.5.1 常用正则表达式参考

第16章 正则表达式

16.3 regexp包

Go在处理正则表达式时主要使用regexp包,包中实现了正则表达式的查找、替换和模式匹配功能。

16.3.1 MatchString函数

MarchString函数接收一个要查找的正则表达式和目标字符串,并根据匹配结果返回true或false,函数定义如下:

func MatchString(pattern string, s string) (matched bool, err error)

对于目标字符串“hello world”,我们通过MatchString函数匹配其中的“hello”字符串,并返回匹配结果:

[ 动手写 16.3.1]

package mainimport ("fmt""regexp"
)func main() {targetString := "hello world"matchString := "hello"match, err := regexp.MatchString(matchString, targetString)if err != nil {fmt.Println(err)}fmt.Println(match)
}

运行结果

在这里插入图片描述

程序执行结果表明匹配成功。那么,如果我们把目标字符串改为“Hello world”,匹配是否会成功呢?

[ 动手写16.3.2 ]

package mainimport ("fmt""regexp"
)func main() {targetString := "Hello world"matchString := "hello"match, err := regexp.MatchString(matchString, targetString)if err != nil {fmt.Println(err)}fmt.Println(match)
}

运行结果

在这里插入图片描述

匹配结果显示失败了,由于正则表达式区分大小写,如果要以不区分大小写的方式查找,必须修改正则表达式,使用一种特殊的语法:

matchString := "(?i)hello"

字符串开头的语法让正则表达式匹配时不区分大小写,运行修改后的示例,结果为true。

[ 动手写 16.3.3 ]

package mainimport ("fmt""regexp"
)func main() {targetString := "Hello world"matchString := "(?i)hello"match, err := regexp.MatchString(matchString, targetString)if err != nil {fmt.Println(err)}fmt.Println(match)
}

运行结果

在这里插入图片描述

没毛病。

16.3.2 FindStringIndex函数

FindStringIndex函数接收一个目标字符串,并返回第一个匹配的起始位置和结束位置,函数定义如下:

func (re *Regexp) FindStringIndex(s string) (loc []int)

由于FindStringIndex函数是Regexp结构体的成员函数,需要对正则表达式进行编译,编译成功后方能使用。

通常使用Compile或MustCompile函数进行编译。

  1. Compile函数:若正则表达式未通过编译,则返回错误。
  2. MustCompile函数:若正则表达式未通过编译,则引发panic。

对于目标字符串“hello world”,我们通过FindStringIndex函数匹配其中的“hello”字符串对应的起始和结束位置:

[ 动手写 16.3.4]

package mainimport ("fmt""regexp"
)func main() {targetString := "hello world"re := regexp.MustCompile(`(\w)+`)res := re.FindStringIndex(targetString)fmt.Println(res)
}

运行结果

在这里插入图片描述

16.3.3 ReplaceAllString函数

ReplaceAllString函数返回第一个参数的拷贝,将第一个参数中所有re的匹配结果都替换为repl,函数定义如下:

func (re *Regexp) ReplaceAllString(src, repl string) string

同样对于目标字符串“hello world”,我们通过ReplaceAllString函数匹配其中的“o”字符并将其替换为“O”:

[ 动手写 16.3.5]

package mainimport ("fmt""regexp"
)func main() {targetString := "hello world"re := regexp.MustCompile(`o`)res := re.ReplaceAllString(targetString, "O")fmt.Println(res)
}

运行结果

在这里插入图片描述

没毛病。

16.4 小结

  • 正则表达式是符合一定规则的表达式,用于匹配字符串中字符组合的模式。
  • 正则表达式的设计思想就是使用一些描述性的符号和文字为字符串定义一个规则。凡是符合这个规则的,程序就认为文本是“匹配”的,否则就认为文本是“不匹配”的。
  • Go在处理正则表达式时主要使用regexp包,包中实现了正则表达式的查找、替换和模式匹配功能。

16.5 知识拓展

16.5.1 常用正则表达式参考

【1】E-mail 地址

^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$

【2】URL 地址

^(https?:\/\/)?([\da-z.-]+)\.([a-z.]{2,6})([\/\w .-])\/?$

【3】匹配首尾空白字符的正则表达式

^\s|\s$

【4】手机号码

^(13[0-9]|14[0-9]|15[0-9]|166|17[0-9]|18[0-9]|19[8|9])\d{8}$

【5】电话号码

^(\d{3,4}-)?\d{7,8}$

【6】18位身份证号码(数字、字母x结尾)

^((\d{18})|([0-9x]{18})|([0-9X]{18}))$

【7】账号是否合法(5~16字节,允许字母、数字、下划线,以字母开头)

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

【8】一年的12个月(01~09和1~12)

^(0?[1-9]|1[0-2])$

【9】日期格式(2018-01-01只做粗略匹配,格式不限制,二月有30天等)

^\d{4}-\d{1,2}-\d{1,2}$

【10】一个月的31天(01~09和1~31)

^((0?[1-9])|((1|2)[0-9])|30|31)$

【11】IP 地址

^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$

http://www.ppmy.cn/news/5793.html

相关文章

SPDK线程模型

一、reactor线程 与传统的reactor线程模型相比,SPDK的reactor在功能实现上还是有很大区别的,线程不在基于流水线形式进行作业,而是采用Run-To-Complete来做运行处理。 如图所示,每个reactor线程会绑定一个cpu core,线…

【代码随想录】数组-golang

数组 from 代码随想录 二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示例 1: 输入: nums [-1,0,3,5,9,12], …

二叉树10:二叉树的最小深度

主要是我自己刷题的一些记录过程。如果有错可以指出哦,大家一起进步。 转载代码随想录 原文链接: 代码随想录 leetcode链接:111. 二叉树的最小深度 题目: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近…

Jenkins + Jmeter + Ant 持续集成

搭建提前安装好:ant Jenkins 环境 一、Jenkins 安装 Ant 插件: 进入Jenkins 配置插件页面,安装ant 插件: 打开插件配置页面,如下图: 点击“Available” 在输入框搜索 ant 安装即可: 二、安装…

一、线程相关概念

文章目录相关概念程序(program)进程线程单线程与多线程并发与并行相关概念 程序(program) 是为完成特定任务、用某种语言编写的一组指令的集合。简单的说:就是我们写的代码。 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程&#xff0c…

-防火墙-

数据来源 一、防火墙的基本概念 防火墙的定义:是一款具备安全防护功能网络设备 ◆ 隔离网络 将需要保护的网络与不可信任网络进行隔离,隐藏信息并进行安全防护 防火墙基本功能: ◆ 访问控制 - ACL ◆ 攻击防护 ◆ 冗余设计 ◆ 路由、交…

redis 大key 防坑指南

目录 一、大key危害 二、为什么会引入大key问题 三、举例 四、如何防控 五、发生了大key问题怎么办 六、如何测试阶段暴露大key问题 一、大key危害 redis大key导致redis负载比较高,影响redis的性能 二、为什么会引入大key问题 存入redis数量不可控&#x…

校园文件发布系统|基于Springboot实现校园文章发布系统

作者主页:编程千纸鹤 作者简介:Java、前端、Pythone开发多年,做过高程,项目经理,架构师 主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享 收藏点赞不迷路 关注作者有好处 文末获得源码 …