正则表达式(3):入门

news2024/11/18 11:48:39

正则表达式(3):入门

      • 小结

本博文转载自

从这篇文章开始,我们将介绍怎样在Linux中使用”正则表达式”,如果你想要学习怎样在Linux中使用正则表达式,这些文章就是你所需要的。

在认识”正则表达式”之前,请先阅读如下两篇文章,如下两篇文章是学习”正则表达式”的基础。

正则表达式从放弃到入门(1):“正则表达式”是什么?
正则表达式从放弃到入门(2):grep命令详解

阅读完上述两篇文章以后,你肯定会明白,grep命令是支持正则表达式的。

所以,我们可以通过grep命令学习正则表达式(下文中简称为”正则”)。

当grep与正则结合在一起时,grep就会根据”正则的含义”在文本中查找符合条件的字符串。

什么是正则?什么是grep?前文介绍过了,我们就不再废话了,直接切入正题

我们通过grep命令来实践一下正则,仍然以前文中提到的例子作为切入点,示例如下:

在这里插入图片描述
我们在系统中创建了一个文件,用于测试正则,文件名为regex

如上图所示,文件中有三行文本,每行都包含”hello”这个单词,如果我们想要利用grep在此文本中搜索包含”hello”的行,则可以使用如下命令。

在这里插入图片描述
没错,由于regex文件中的每一行都包含hello,所以,所有行都被打印出来了。

如果,我们只想要打印出”以hello开头的行”(hello位于行首的行),该怎么办呢?没错,使用正则表达式即可,示例如下

在这里插入图片描述
前文中已经介绍过,在正则表达式中,””表示”锚定行首”(符号””是数字键6对应的符号),所以”^hello”表示只匹配位于行首的hello字符串。

由于regex文本中的第二行的hello位于行尾,所以,第二行并不符合条件,于是,只有第一行与第三行被打印了出来。

“^”在正则中表示锚定行首,那么,什么符号在正则中表示锚定行尾呢?

”在正则中表示锚定行尾,符号” ”在正则中表示锚定行尾,符号” 在正则中表示锚定行尾,符号”为数字键4对应的符号,那么我们来看看怎样锚定行尾,仍然以之前的regex文本为例,regex文本中的第二行中,单词hello位于行的尾部,所以,我们可以使用”hello$”,去匹配”位于行尾的hello”字符串,示例如下:

在这里插入图片描述

如上所示,”hello$”表示匹配位于行尾的hello字符串,只有第二行满足条件,所以,只有第二行被输出了。

我们已经学会了^ 与 “$”,我们知道,它们在正则表达式中分别代表锚定行首与锚定行尾,那么,我们将它们结合在一起使用,"^ hello$“表示什么意思呢?聪明如你一定猜到了,”^hello$"表示hello既位于行首,同时也位于行尾,换句话说,就是整行中只有一个单词hello,没有其他单词,那么是这样吗,我们来试一试,在regex中新加一行,只包含hello一个单词,如下。

在这里插入图片描述

现在,我们使用正则表达式”^hello$”,看看能不能匹配到文本中的第四行。

在这里插入图片描述
如上图所示,我们成功额匹配到了regex文本中的第四行,并且将第四行打印了出来。

看到这里,我想你应该已经学会举一反三了,”hello$”表示hello即位于行首也位于行尾,那么”^$”表示什么意思呢?没错,”$”表示行首与行尾相连,换句话说,就是”空行”,我们在regex中添加一行”空行”,看看能不能匹配到,示例如下:

在这里插入图片描述

我们直接在第二行后按回车键,于是第三行变成了”空行”,注意,”空行”表示当前行不包含任何字符,包含”空格”的行不能被当做”空行”。

现在,我们来使用正则表达式”^$”,试试能不能匹配到文本中的第三行,如下图所示。

在这里插入图片描述

可以看到,文本中的”空行”被匹配到了。

现在,我们已经能够灵活的锚定”行首”与”行尾”了,那么,我们能不能锚定”词首”或”词尾”呢?

必须能啊,正则表达式中,”<“表示锚定词首,”>”表示锚定词尾。

为了方便示例,我们再准备另外一个测试文件REG,文件内容如下。

在这里插入图片描述

上图中,”abchello”中包含”hello”,但是”hello”位于”abchello”这个单词的词尾,同理,”helloabc”中也包含”hello”,但是”hello”位于”helloabc”这个单词的词首。

刚才提到过,正则表达式中,”<“表示锚定词首,”>”表示锚定词尾,现在我们就来实验一下。

在这里插入图片描述

如上图所示,”<hello”表示以hello作为词首的单词将会被匹配到,”hello>”表示以hello作为词尾的单词将会被匹配到。

同理,我们也可以将”<“与”>”结合在一起使用,示例如下。

为了测试,我们在REG文件中又添加了一行,内容如下

在这里插入图片描述

上图中,”<hello>”表示当hello既是词首又是词尾时则会被匹配到,换句话说,就是当hello作为一个独立的单词时,则会被匹配到,如上图所示,REG文本中第4行被匹配到了,因为只有第4行中才包含了一个独立的hello单词。

其实,正则表达式中,除了”<“与”>”能够表示锚定词首与锚定词尾以外,我们还可以使用”\b”去代替”<“和”>”,”\b”既能锚定词首,也能锚定词尾,示例如下。

在这里插入图片描述

聪明如你,只要懂得了”<“与”>”,再结合上述示例理解”\b”,绝对不是事儿。

“\b”还有一个孪生兄弟,”\B”,虽然它们长得很像,但是它们的功能完全不一样。

“\b”是用来锚定词首、锚定词尾的,换句话说,”\b”是用来匹配”单词边界”的,而”\B”则正好相反。

“\B”是用来匹配”非单词边界”的,这样说并不容易理解,看了示例就会秒懂,示例如下。

在这里插入图片描述

上例中的”\Bhello”表示,只要hello不是词首,就会被匹配到,如上图所示。

而”\bhello”表示,只要hello是词首,就会被匹配到,所以,”\B”与”\b”所要表达的意思正好相反。

“hello\b”与”hello\B”同理,此处不再赘述,快动手试试吧。

在正则表达式中,又有”基础正则表达式”和”扩展正则表达式”之分(此处不用纠结,后面会专门对扩展正则表达式进行总结,我们现在所展示的都是基本正则表达式,学会了”基本正则表达式”,再看”扩展正则表达式”,绝对分分钟搞定)。

有些符号在基础正则表达式中和扩展正则表达式中是通用的,有些则不然。

比如我们今天学习到的这些符号,就是通用的,不管是在基础正则还是扩展正则中,它们表示的含义都是相同的。

细心如你一定发现了,今天所使用的正则表达式都与”位置”有关,比如”行首”、”行尾”、”词首”、”词尾”等,我们可以把这些符号理解为与”位置匹配”有关的正则表达式。

我们今天所认识的符号只是正则表达式中的一部分,之后的文章我们会继续总结正则表达式,只要坚持看完它们,你肯定会掌握正则表达式的。

小结

为了方便以后回顾。我们一起来总结一下上文中提到过的这些符号。

^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。

$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。

^$:表示匹配空行,这里所描述的空行表示”回车”,而”空格”或”tab”等都不能算作此处所描述的空行。

^abc$:表示abc独占一行时,会被匹配到。

<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。

>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。

\B:匹配非单词边界,与\b正好相反。

这篇文章中所涉及到的只是正则表达式中的一部分。


不知道这些文章能不能对你有所帮助?

如果能够帮到你,希望你能够给我一些回应(比如留言、评论、点赞)。

让我确定写这些文章是有价值的,我会继续写下去。

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

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

相关文章

【unity3D】unity中如何查找和获取游戏物体

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity中游戏物体的查找与获取 这里写自定义目录标题 获取当前物体的基本属性查找其它物体- 通过名称查找其它物体- 通过标签查找- 通过类…

微信开发者工具里面模拟操作返回、录屏、网络速度、截屏等操作

有时候可能因为自己开发的页面使用了自定义的样式&#xff0c;所以没有了左上角的导航返回&#xff0c;所以进入我自定义的页面后&#xff0c;想要返回的话&#xff0c;就可以用到这里面你的操作&#xff0c;或者想截屏了也可以直接使用里面的截屏&#xff0c;或者返回主页面等…

如何有效进行测试执行进度计划

测试执行通常都是处于软件测试生命周期的关键路径上&#xff0c;它不仅在测试过程中占有重要的地位&#xff0c;并且也会花费大量的测试时间。针对测试执行而进行的计划&#xff0c;即测试执行进度计划&#xff0c;是进行测试执行进度控制的基础。在进行测试执行进度计划制订的…

龙迅分配器LT86102UXE/LT86104UX,HDMI一分二/HDMI一分四

龙迅LT86102UXE描述; Lontium LT86102UXE HDMI2.0分配器具有1&#xff1a;2的分配器&#xff0c;符合HDMI2.0/1.4规范&#xff0c;最大6Gbps高速数据速率&#xff0c;自适应均衡RX输入和预先强调的TX输出&#xff0c;以支持长电缆应用程序&#xff0c;内部TX通道交换灵活的PCB…

C++进阶篇6---lambda表达式

目录 一、lambda表达式 1.引入 2、lambda表达式语法 二、包装器---function 1.引入 2.包装器介绍 三、bind 一、lambda表达式 1.引入 class Person { public:Person(int age,string name):_age(age),_name(name){} //private://方便后面的举例int _age;string _name…

全网最新最全的自动化测试教程:python+pytest接口自动化(9)-cookie绕过登录(保持登录状态

在编写接口自动化测试用例或其他脚本的过程中&#xff0c;经常会遇到需要绕过用户名/密码或验证码登录&#xff0c;去请求接口的情况&#xff0c;一是因为有时验证码会比较复杂&#xff0c;比如有些图形验证码&#xff0c;难以通过接口的方式去处理&#xff1b;再者&#xff0c…

【openssl】RSA 生成公钥私钥 |通过私钥获取公钥

通过博客&#xff1a;Window系统如何编译openssl 编译出openssl.exe&#xff08;位于apps文件夹下&#xff09;。 现在需要使用它获得公钥私钥、通过私钥获取公钥 目录 说明&#xff01;&#xff01;&#xff01; 一.定位openssl.exe目录 二、进入命令cmd 三、生成私钥 …

知虾数据工具:助力Shopee商家实现数据化运营的有力助手

在如今竞争激烈的电商市场中&#xff0c;了解市场趋势、优化产品和店铺运营、了解竞争对手等是商家取得成功的关键。而针对Shopee平台的知虾数据工具则为商家和市场分析师提供了一个强大的数据分析工具。本文将介绍知虾数据工具的主要功能&#xff0c;包括多站点数据分析、行业…

抖音视频水印怎么去除?这三个视频去水印技巧值得收藏!

抖音视频水印怎么去除&#xff1f;随着互联网的持续发展&#xff0c;越来越多的人选择使用视频分享平台来展示他们的生活与工作。然而&#xff0c;上传到这些平台上的许多视频常常遭到恶意水印的攻击&#xff0c;严重影响了观众的观看体验。今天&#xff0c;我们将分享三个视频…

一键式紧急报警柱系统

随着科技的不断发展&#xff0c;一键式紧急报警柱在我们的生活和工作中扮演着越来越重要的角色。在这篇文章中&#xff0c;我们将一起探究与一键式紧急报警柱有关的知识。 一键式紧急报警柱是一种常见的安全防护设备&#xff0c;能够在紧急情况下快速发出警报&#xff0c;保护…

ChatGPT发布一年后,搜索引擎的日子还好吗?

导读&#xff1a;生成式AI&#xff0c;搜索引擎的终结者还是进化加速器 ChatGPT发布刚刚一年&#xff0c;互联网世界已经换了人间。 2023年&#xff0c;以ChatGPT和大模型为代表的生成式AI浪潮对全球互联网、云计算、人工智能领域都带来巨大冲击。而且生成式AI在各行各业的应用…

Oracle的数据一致性机制原理

一、前言 在单用户环境下&#xff0c;在操作数据库是不需要考虑其他用户会修改同一个数据。但是在多用户的情况下&#xff0c;多个事务可能会修改同一个数据&#xff0c;最终会得到错误的数据结果。 Oracle数据库是通过 multiversion consistency model&#xff08;多版本数据…

HDFS客户端及API操作实验

实验二 HDFS客户端及API操作 实验目的&#xff1a; 1.掌握HDFS的客户端操作&#xff0c;包括上传文件、下载文件、重命名、查看目录等&#xff1b; 2.掌握HDFS的Java API使用&#xff0c;能够利用Java API实现上传、下载等常用操作&#xff1b; 实验内容&#xff1a; HDF…

使用coco数据集进行语义分割:数据预处理与损失函数

如何coco数据集进行目标检测的介绍已经有很多了&#xff0c;但是关于语义分割几乎没有。本文旨在说明如何处理 stuff_train2017.json stuff_val2017.json panoptic_train2017.json panoptic_val2017.json&#xff0c;将上面那些json中的dict转化为图片的label mask&am…

【Qt开发流程】之定时器事件与随机数示例

描述 QObject是所有Qt对象的基类&#xff0c;提供了Qt中基础的定时器支持。通过QObject::startTimer()函数&#xff0c;可以使用毫秒为单位的时间间隔来启动一个定时器。该函数返回一个唯一的整数定时器ID。该计时器现在将以规律的间隔触发&#xff0c;直到显式调用QObject::k…

谷歌用AI模型发现220万种新材料,研究能力超越人类!

谷歌旗下的AI研究机构DeepMind在全球顶级学术期刊《Nature》上发布了一篇论文&#xff0c;通过深度学习、计算机视觉、大数据等&#xff0c;开发了一个名为GNoME的图神经网络模型&#xff0c;主要用于材料发现。 研究团队通过GnoME便快速发现了220万个新的材料晶体结构&#x…

JVM==>图解字节码指令

一&#xff0c;原始代码 我们来看一下执行这段代码的具体流程 那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中&#xff0c;交给CPU运行 1&#xff09;常量池载入运行时常量池 我们发现 10 并没有被存入常量池中&#xff0c; 这是因为short范围以内的数字不会…

微机原理9

一、单项选择题(本大题共15小题,每小题3分、共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8088 系统的内存最大容量为 16MB. 其地址总线为&#xff08;&#xff09; A. 16 位 B. 20 位 C. 24 位 D. 32 位 2,以CPU为核心…

YITH WooCommerce Social Login跨境电商网站社交登录高级版插件

点击阅读YITH WooCommerce Social Login跨境电商网站社交登录高级版插件原文 YITH WooCommerce Social Login跨境电商网站社交登录高级版插件让您的用户节省时间并通过他们的社交资料之一登录或注册网站。 您如何从中受益&#xff1a; 用户无需填写表格、插入个人数据&#…

【数电笔记】06-码制

目录 说明&#xff1a; 二进制代码 1. 二 - 十进制码 2. 常用二 - 十进制代码表 2.1 例题 可靠性代码 1. 格雷码 2. 奇偶校验码 3. 8421奇偶校验码表 说明&#xff1a; 笔记配套视频来源&#xff1a;B站&#xff1b;本系列笔记并未记录所有章节&#xff0c;只对个人认…