非零基础自学Golang 第16章 正则表达式 16.1 正则表达式介绍 16.2 正则表达式语法

news2024/11/16 11:30:27

非零基础自学Golang

文章目录

      • 非零基础自学Golang
      • 第16章 正则表达式
        • 16.1 正则表达式介绍
        • 16.2 正则表达式语法
          • 16.2.1 普通字符
          • 16.2.2 字符转义
          • 16.2.3 元字符
          • 16.2.4 限定符
          • 16.2.5 定位符
          • 16.2.6 分组构造
          • 16.2.7 匹配模式

第16章 正则表达式

正则表达式(Regular Expression,在代码中常简写为regex、regexp或RE),又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法,是计算机科学的一个概念。

目前,很多编程语言都支持正则表达式。

16.1 正则表达式介绍

正则表达式,即符合一定规则的表达式,是用于匹配字符串中字符组合的模式

正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。

在很多文本编辑器里,正则表达式通常被用来检索、替换那些匹配某个模式的文本(字符串)。

字符串是在编程中多有涉及的一种数据结构,所以对字符串的操作也是各式各样,而且形式多变,那么如何方便快捷地处理字符串就是我们要学习的重中之重了。【好!】

例如,我们要判断用户输入的E-mail地址是否合法,如果我们不使用正则表达式来判断,就得通过自定义一个函数提取“@”关键字,再分割其前后的字符串,然后分别判断是否合法等步骤来实现。

又例如在各大网站注册用户时常看到的对用户名的要求(如6~18个字符,可使用字母、数字、下划线,需以字母开头等),如果不是用正则表达式来判断,我们就要写一堆麻烦的代码来判断用户输入的用户名是否合法。这样的代码不但冗长、不能一目了然,而且还难以重复利用,若要应对多变的需求就更不方便维护了。【说的在理】

但是,有了正则表达式便简单多了,正则表达式正是为这种匹配判断文本类型的工作而诞生的。

正则表达式的设计思想就是使用一些描述性的符号和文字为字符串定义一个规则。

凡是符合这个规则的,程序就认为文本是“匹配”的,否则就认为文本是“不匹配”的。通俗地讲,正则表达式的匹配过程就是逐字匹配表达式的描述规则,如果每个字符都匹配,那么程序就认为匹配成功;只要有一个匹配不成功,那么匹配就失败。

16.2 正则表达式语法

16.2.1 普通字符

普通字符是正则表达式中最基本的结构之一,要理解正则表达式自然也要从普通字符开始。

普通字符包括没有显式指定为元字符的所有可打印和不可打印字符。

这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。

我们先以数字作为例子。假设我们想判断一个长度为1的字符串是否是数字(即这个位置上的字符只能是“0”“1”“2”“3”“4”“5”“6”“7”“8”“9”这十个数字),如果我们使用程序去判断,那么一个可能的思路是用十个条件分支去判断这个字符串是否等于这十个字符。

伪代码如下:

num == "0" or num == "1" or num == "2" …… or num == "9"

这不失为一种有效的办法,但是太过于烦琐。

如果我们判断的是英文字母或者长度非常长并且可能是各种字符混合的字符串时,代码就几乎无法阅读了。但是我们使用普通字符就可以非常简单地解决此类问题。

[0123456789]

这就是判断一个长度为1的字符串是否是数字的正则表达式。方括号“[]”表示这是一个字符组,代表一位字符。

方括号中的数字“0123456789”表示只要待匹配的字符串与其中任何一个字符相同,那么程序就会认为匹配成功,反之则认为匹配失败。

当然还有更简单的写法:

[0-9]

如果符合规则的字符范围是连续的,我们可以用“-”省略中间的字符,相当于汉字中的“到”,直接可以读成“零到九”。

为什么是“0-9”而不是“9-0”呢?要理解这个问题,必须要了解字符的本质。

在正则中,所有的字符类型都有对应的编码。下图是一张ASCII编码表,

在这里插入图片描述

“0”对应的是十进制的48,“9”对应的是十进制的57。码值小的在前,码值大的在后,所以判断数字须写成“[0-9]”。

同理,如果想判断一个长度为1的字符串是不是英文小写字母,我们可以写成:

[a-z]

注意:虽然ASCII编码表中大写字母在小写字母之前,但是我们并不应该用“[A-z]”来包括所有大小写英文字母,因为在这个范围中也包含了其他特殊字符,严谨的方法应该是“[A-Za-z]”或者“[a-zA-Z]”。

那么如何判断一个长度为2的字符串是否是数字呢?

[0-9][0-9]

没错,只要写两遍就行了(下一节将会介绍更简捷的办法)。假设想判断用户输入的是“Y”还是“y”,正则只需写成:

[Yy]

【懂了!!!】

当允许的字符范围只有一个时可以省略“[]”。例如,判断用户输入的是“Yes”还是“yes”:

[Yy]es
16.2.2 字符转义

OK,之前我们已经看到代表数字范围“0”到“9”时使用的是“[0-9]”,其中“-”表示范围,并不代表字符“-”本身,此类字符我们称之为元字符。

不只是“-”,例子中“[”“]”都是元字符,这些字符在匹配中都有着特殊的意义。

那么如果我们想匹配“-”字符本身的话,就需要做特殊处理了

其实在正则中,这类字符转义都有通用的方法,就是在字符前加上“\”。

例如,匹配“[”本身,正则可以写成:

[\[]

如果想匹配“0”“-”和“9”这三个字符,则可以写成:

[0\-9]

这样就只会匹配“0”“-”和“9”三个字符,而不是“0”到“9”十个字符。

【懂了】

16.2.3 元字符

元字符就如上文所说,是在正则表达式中有特殊意义的字符。

下表列出了正则中常见的元字符。

在这里插入图片描述

在这里插入图片描述

元字符数量较多,后面几节会详细 介绍一下 常用的元字符。

16.2.4 限定符

限定符指定输入中必须存在字符、组或字符类的多少个实例才能找到匹配项。

上一小节中的“*”“+”“?”“{n}”“{n,}”和“{n, m}”都是限定符。

我们先来介绍“{n}”。

“{n}”限定符表示匹配上一元素n次,其中n是任意非负整数。

例如,“y{5}”只能匹配“yyyyy”;“3{2}”则只能匹配“33”;“\w{3}”可以匹配任意三位英文字母,“yes”“Yes”“abc”和“ESC”都是可以匹配的,但是“No”“123”“No1”都不能被匹配。

“{n,}”限定符表示至少匹配上一元素n次,其中n是任意非负整数。

例如,“y{3,}”可以匹配“yyy”也可以匹配“yyyyyy”。同理,“[0-9]{3,}”可以匹配任意三位数及数位为三以上的数字。

“{n, m}”限定符表示至少匹配上一元素n次,但不超过m次,其中n和m是非负整数。

例如,“y{2,4}”可以匹配“yy”“yyy”和“yyyy”。同理,“[0-9]{8,11}”表示可以匹配任意八位至十一位的数字。

“*”限定符表示与前面的元素匹配零次或多次,它相当于“{0,}”限定符。例如,“91*9*”可以匹配“919”“9119”“9199999”等,但是不能匹配“9129”“929”等。

“+”限定符表示匹配上一元素一次或多次,它相当于“{1,}”限定符。例如,“an\w+”可以匹配“antrum”等以“an”开头的字母数量为三及以上的单词,但是不能匹配“an”。

“?”限定符表示匹配上一元素零次或一次,它相当于“{0,1}”。例如,“an?”可以匹配“a”和“an”,但是不能匹配“antrum”。

16.2.5 定位符

定位符能够将正则表达式固定到行首或行尾。

它们还能够创建这样的正则表达式:正则表达式将出现在一个单词内、一个单词的开头或者一个单词的结尾。

定位符用来描述字符串或单词的边界,“^”和“$”分别指字符串的开始与结束,“\b”描述单词的前或后边界,“\B”表示非单词边界。

正则表达式的定位符如下表所示。

在这里插入图片描述

”定位符指定以下模式必须从字符串的第一个字符位置开始。例如,“\w+”可以匹配“123abc”中的“abc”,“\w+”则不能匹配“123abc”,但是可以匹配“abc123”中的“abc”,因为整个字符串必须是以字母开头。

KaTeX parse error: Undefined control sequence: \n at position 39: …尾,或出现在输入字符串末尾的“\̲n̲”之前。例如,“\w+”可以匹…”则不能匹配“abc123”,但是可以匹配“123abc”,因为整个字符串必须是以字母结尾。

“\b”定位符指定匹配必须出现在单词字符(“\w”语言元素)和非单词字符(“\W”语言元素)之间的边界上。单词字符包括字母、数字、字符和下划线;非单词字符包括不为字母、数字、字符或下划线的任意字符。匹配也可以出现在字符串开头或结尾处的单词边界上。“\b”定位符经常用于确保子表达式与整个单词(而不仅与单词的开头或结尾)匹配。例如,字符串“area bare arena mare”使用正则表达式“\bare\w*\b”去匹配,“area”“arena”是满足此正则表达式的。

“\B”定位符指定匹配不得出现在单词边界上,它与“\b”定位符截然相反。例如,字符串“equity queen equip acquaint quiet”使用正则表达式“\Bqu\w+”去匹配,“quity”“quip”和“quaint”是满足此正则表达式的。

16.2.6 分组构造

分组构造描述了正则表达式的子表达式,用于捕获输入字符串的子字符串。

以下是分组构造捕获匹配的子表达式:

(子表达式)

其中“子表达式”为任何有效正则表达式模式。使用括号的捕获按正则表达式中左括号的顺序从一开始就由左到右自动编号。

例如,字符串“He said that that was the correct answer.”我们使用“(\w+)\s(\w+)\W”来匹配,结果则是:

“He said”一组,其中“He”和“said”各为一个子组;

“that that”一组,其中“that”和“that”各为一个子组;

“was the”一组,其中“was”和“the”各为一个子组;

“correct answer.”一组,其中“correct”和“answer.”各为一个子组。
16.2.7 匹配模式

匹配模式指的是匹配的时候使用的规则。使用不同的匹配模式可能会改变正则表达式的识别,也可能会改变正则表达式中字符的匹配规定。

不区分大小写模式指的就是在匹配单词时,正则表达式将不会区分字符串中的大小写。例如期望用户输入“yes”,但是用户也有可能输入“Yes”或者“yES”等,如果区分大小写,那么正则表达式就要写成“[yY][eE][sS]”,这样做确实可以匹配到想要的结果,但是写起来就很麻烦。如果启用了不区分大小写模式匹配字符串,我们只需使用正则“yes”就可以匹配用户输入的各种大小写混杂的“Yes”“yes”“yEs”了。

单行模式(也叫点号通配)会改变元字符“.”的匹配方式。元字符“.”几乎可以匹配任何字符,但是默认情况下“.”不会匹配“\n”换行符。然而,有时候确实想要匹配“任何字符”,此时单行模式就可以让“.”匹配任何字符(当然也可以使用如“[\s\S]”“[\w\W]”等技巧来匹配所有字符)。

多行模式改变的是“^”和“ ”的匹配方式。默认模式下, “ ” 和“ ”的匹配方式。默认模式下,“^”和“ 的匹配方式。默认模式下,”匹配的是整个字符串的起始位置和结束位置;但是在多行模式下,它们将会匹配字符串内部某一行文本的起始位置和结束位置。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?

在上一篇,我们学会了redis集群的扩容。从3主3从扩容到4主4从。 那么,接着,活动过去了。流量没有那么大了。需要缩容了。从4主4从缩容到3主3从了。那么这个时候又该怎么处理呢? PS本系列:《Docker学习系列》教程已经发布的内容,凯哥会在文末加上。 缩容思考问题: 1:…

TypeScript 前端工程最佳实践

作者:王春雨 前言 随着前端工程化的快速发展, TypeScript 变得越来越受欢迎,它已经成为前端开发人员必备技能。 TypeScript 最初是由微软开发并开源的一种编程语言,自2012年10月发布首个公开版本以来,它已得到了人们…

Docker自定义镜像上传阿里云

目录 1. alpine 简介 2. 基于alpine构建jdk8镜像 2.1 Dockerfile 2.2 将构建目录上传到linux中 2.3 执行构建 3. 镜像瘦身 4. 上传阿里云镜像仓库 1. alpine 简介 Alpine Linux是一个轻型Linux发行版,它不同于通常的Linux发行版,Alpine采用了mus…

斯坦福联合Meta提出多模态模型RA-CM3,检索增强机制或成文本图像领域新制胜法宝

原文链接:https://www.techbeat.net/article-info?id4403 作者:seven_ 论文链接: https://arxiv.org/abs/2211.12561 相信目前很多AI大模型研究者都会遇到一个非常困难的问题,那就是很难控制的模型参数和容量,由于参与…

【Three.js入门】纹理及其常用属性、透明纹理、环境遮挡贴图与强度

个人简介 👀个人主页: 前端杂货铺 🙋‍♂️学习方向: 主攻前端方向,也会涉及到服务端 📃个人状态: 在校大学生一枚,已拿多个前端 offer(秋招) 🚀未…

消息队列—RabbitMQ(万字详解)

消息队列—RabbitMQ 笔记整理自 【涛哥】最适合小白入门的RabbitMQ教程 1. 消息队列介绍 Ⅰ. 消息队列需求场景 在基于微服务开发的电商项目中,商品的查询和商品的修改是通过两个服务实现的,如果修改了商品的价格,如何保证商品查询服务查询出…

矢量网络分析仪如何测量史密斯图及滤波器的带宽?

矢量网络分析仪是一种很神奇的测量仪器,它的功能很强大也值得人们去探索。今天,安泰测试工程师就针对矢量网络分析仪中的史密斯图及滤波器的带宽测量进行简单的介绍,希望能够让更多的人对此有所了解,并产生兴趣。 首先仪器了解一下…

数字孪生可视化图表:了解堆叠的条形图

数据可视化已成为我们日常数据分析工作当中的重要组成部分,可视化大屏是数据可视化发展的产物。这又不得不说到一个概念:可视化组件。可视化组件是制作数字孪生可视化大屏必不可少的一部分,在一个完整的数字孪生可视化大屏中用到的图表可不少…

Android系统之路(初识MTK) ------Android11.0给辅助工具-手电筒添加低电Toast提醒

Android11.0给辅助工具-手电筒添加低电Toast提醒 今天因为在复测昨天的一个monkey压测并且还没测完,所以打算记录最近做系统开发的一些心得和经验,也记录一下自己的系统开发历程 修改前的效果图: 修改后的效果图: 后期补上… 修改前当电量小于等于15%时,按钮依旧可以打…

11条非常实用的Git 和 Git 命令,值得你收藏

基本命令 01. init git init 在当前目录中创建一个新的空仓库。 02. clone git clone https://github.com/facebook/react.git 将远程存储库复制到当前目录。 03. add git add 命令将工作目录中的新文件或更改的文件添加到 Git 暂存区。 git add <file1> <file2&…

【WAF绕过-4】漏洞利用之注入上传跨站等绕过

1、SQL注入 如需sqlmap注入测试&#xff0c; 防cc拦截&#xff1a;修改user-agent头代理&#xff08;付费代理池&#xff09; 修改user-agent头&#xff1a; &#xff08;1&#xff09;加参数&#xff1a;--random-agent &#xff08;2&#xff09;加参数&#xff1a;--user-a…

几十年前的老旧照片如何修复?还不知道旧照片怎么恢复清晰吗?

那些旧照片本身会随着时间的推移而褪色、褶皱。老旧照片修复主要是从褪色、变色、破损、发霉、的旧相片修复翻新&#xff0c;到模糊不清清晰化处理&#xff0c;大面积严重破损照片修补。 十年以前&#xff0c;没有电脑&#xff0c;没有手机&#xff0c;更没有存储照片工具。大…

【关于时间序列的ML】项目 5 :用机器学习预测天气

&#x1f50e;大家好&#xff0c;我是Sonhhxg_柒&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流&#x1f50e; &#x1f4dd;个人主页&#xff0d;Sonhhxg_柒的博客_CSDN博客 &#x1f4c3; &#x1f381;欢迎各位→点赞…

基于Canal+kafka监听数据库变化的最佳实践

1、前言 工作中&#xff0c;我们很多时候需要根据某些状态的变化更新另一个业务的逻辑&#xff0c;比如订单的生成&#xff0c;成交等&#xff0c;需要更新或者通知其他的业务。我们通常的操作通过业务埋点、接口的调用或者中间件完成。 但是状态变化的入口比较多的时候&#x…

位图详解.

1.位图概念 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中&#xff1f; 思考&#xff1a; 1.用哈希表&#xff1f;遍历一遍&#xff1f;时间复杂度O(N) 40亿个不重复无符号整数占多大内存&#xff1…

springcloud配置中心nacos动态线程池Dynamic-tp配置接入实战

最近业务上需要把项目组几个微服务接入动态线程池框架Dynamic-tp监控&#xff0c;同时支持webhook机器人接受变更通知、容量报警、活性报警、拒绝报警、任务超时报警等通知&#xff0c;方便项目组同事企业微信群实时监控线程池状态&#xff0c;动态调整线程参数。 接手开始上手…

【C++学习】对二维数组进行排序

1 问题描述 今天在学习 CUDA-NMS 算法时&#xff0c;遇到一个小问题&#xff0c;就是希望对一个二维数组进行排序&#xff0c;具体是这样的&#xff1a; 需要对存储目标框的二维数组进行排序&#xff0c;排序的方式是按照目标框的得分score从高往低排序&#xff0c;也就是结果…

微服务系列 - Zookeeper上篇:入门到精通

一、前言 本内容仅用于个人学习笔记&#xff0c;如有侵扰&#xff0c;联系删除 视频教程&#xff1a;【尚硅谷】大数据技术之Zookeeper 3.5.7版本教程 源码学习&#xff1a;微服务系列 - Zookeeper下篇&#xff1a;源码解析 二、Zookeeper入门 1、概述 Zookeeper是一个开…

消息队列(MQ)

文章目录什么是消息队列定义消息队列的特性&#xff1a;1、解耦&#xff1a;2、削峰&#xff1a;3、异步&#xff1a;使用场景传统串行化设计串行化思想&#xff1a;并行处理调优高可用&#xff1a;高并发高性能MQ的两种流派MQ常见的问题1&#xff0c;mq如何避免消息堆积问题。…

如何解决甲乙双方需求理解巨大偏差的问题?

1、对双方进行专业培训 需求分析人员对需求方应用领域不熟悉&#xff0c;而需求方对软件开发也不熟悉&#xff0c;通过对双方进行专业知识培训&#xff0c;让双方对用户专业领域和软件开发领域都有较为清晰的认识。在此基础上&#xff0c;需求方提出的需求更精准&#xff0c;双…