正则表达式(3):入门
正则表达式(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正好相反。
这篇文章中所涉及到的只是正则表达式中的一部分。
不知道这些文章能不能对你有所帮助?
如果能够帮到你,希望你能够给我一些回应(比如留言、评论、点赞)。
让我确定写这些文章是有价值的,我会继续写下去。
相关文章:
正则表达式(3):入门
正则表达式(3):入门 小结 本博文转载自 从这篇文章开始,我们将介绍怎样在Linux中使用”正则表达式”,如果你想要学习怎样在Linux中使用正则表达式,这些文章就是你所需要的。 在认识”正则表达式”之前&am…...
《系统架构设计师教程(第2版)》第2章-计算机系统基础知识-01-计算机硬件
文章目录 1. 计算机系统概述2. 计算机硬件2.1 处理器(CPU)2.2 存储器2.2.1 概述2.2.2 按硬件结构分类2.2.3 按与处理器距离分2.3 总线(Bus)2.3.1 概念2.3.2 分类2.3.3 串行总线和并行总线2.4 接口2.4.1 概念2.4.2 常见接口2.5 外部设备1. 计算机系统概述 #mermaid-svg-IcU0sR…...
用友NC word.docx接口存在任意文件读取漏洞
声明 本文仅用于技术交流,请勿用于非法用途 由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。 一、产品介绍 用友 NC Cloud,大型企业数字化平台ÿ…...
【离散数学】——期末刷题题库(等价关系与划分)
🎃个人专栏: 🐬 算法设计与分析:算法设计与分析_IT闫的博客-CSDN博客 🐳Java基础:Java基础_IT闫的博客-CSDN博客 🐋c语言:c语言_IT闫的博客-CSDN博客 🐟MySQL:…...
IDEA maven无法下载源代码处理
1、使用idea内置maven 在idea中新增一个mvn运行项,截图如下: 输入命令: dependency:resolve -Dclassifiersources 2、如果外部maven,不使用idea内部maven 在工程目录下命令行执行命令: mvn dependency:resolve -Dclassifiersources...
基于B/S架构的医院一体化电子病历编辑器源码
电子病历在线制作、管理和使用的一体化电子病历解决方案,通过一体化的设计,提供对住院病人的电子病历书写、保存、修改、打印等功能。电子病历系统将临床医护需要的诊疗资料以符合临床思维的方法展示。建立以病人为中心,以临床诊疗信息为主线…...
免费百度SEO优化工具,百度SEO优化排名工具
百度SEO关键词工具 让我们聚焦在百度SEO关键词工具上。对于任何想要在百度搜索引擎中脱颖而出的网站管理员而言,深入了解用户搜索习惯和关键词的选择是至关重要的。 百度SEO关键词工具不仅提供了免费的服务,而且功能强大。通过输入相关领域的关键词&…...
12.Java程序设计-基于Springboot框架的Android学习生活交流APP设计与实现
摘要 移动应用在日常生活中扮演着越来越重要的角色,为用户提供了方便的学习和生活交流渠道。本研究旨在设计并实现一款基于Spring Boot框架的Android学习生活交流App,以促进用户之间的信息分享、学术交流和社交互动。 在需求分析阶段,我们明…...
JVM虚拟机(已整理,已废弃)
# JVM组成 ## 简述程序计数器 线程私有,内部保存class字节码的行号。用于记录正在执行的字节码指令的地址。 线程私有-每个线程都有自己的程序计数器PC,用于记录当前线程执行哪个行号 ## 简述堆 ## 简述虚拟机栈 ## 简述堆栈区别 ## 方法内局部变量是…...
强化学习——简单解释
一、说明 最近 OpenAI 上关于 Q-star 的热议激起了我温习强化学习知识的兴趣。这是为强化学习 (RL) 新手提供的复习内容。 二、强化学习的定义 强化学习是人类和其他动物用来学习的学习类型。即,通过阅读房间来学习。(从反馈中学习)。让我解…...
IoT DC3 是一个基于 Spring Cloud 全开源物联网平台 linux docker部署傻瓜化步骤
如有不了解可先参考我的另一篇文章本地部署:IoT DC3 是一个基于 Spring Cloud 的开源的、分布式的物联网(IoT)平台本地部署步骤 如有不了解可先参考我的另一篇文章本地部署: 1 环境准备: JDK 8 以上 docker 安装好 下载docker-compose-dev.yml 文件 执行基础环境docker安装 …...
SSM项目实战-前端-在Index.vue中展示第一页数据
1、util/request.js import axios from "axios";let request axios.create({baseURL: "http://localhost:8080",timeout: 50000 });export default request 2、api/schedule.js import request from "../util/request.js";export let getSchedu…...
深入理解mysql的explain命令
1 基础 全网最全 | MySQL EXPLAIN 完全解读 1.1 MySQL中EXPLAIN命令提供的字段包括: id:查询的标识符。select_type:查询的类型(如SIMPLE, PRIMARY, SUBQUERY等)。table:查询的是哪个表。partitions&…...
相交链表(LeetCode 160)
文章目录 1.问题描述2.难度等级3.热门指数4.解题思路方法一:暴力法方法二:哈希表方法三:双栈方法四:双指针:记录链表长度方法五:双指针:互换遍历 5.实现示例参考文献 1.问题描述 给两个单链表的…...
C++多态(详解)
一、多态的概念 1.1、多态的概念 多态:多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。 举个例子:比如买票这个行为,当普通人买票时,是全价买票;学生买票时&am…...
06、基于内容的过滤算法Tensorflow实现
06、基于内容的过滤算法Tensorflow实现 开始学习机器学习啦,已经把吴恩达的课全部刷完了,现在开始熟悉一下复现代码。全部工程可从最上方链接下载。 05、基于梯度下降的协同过滤算法中已经介绍了协同过滤算法的基本实现方法,但是这种方法仅…...
html/css中用float实现的盒子案例
运行效果: 代码部分: <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style type"text/css">.father{width:300px; height:400px; background:gray;…...
simulink中 Data store memory、write和read模块及案例介绍
目录 1.Data store memory模块 2.data store write模块 3.data store read模块 4.仿真分析 4.1简单使用三个模块 4.2 模块间的调用顺序剖析 1.Data store memory模块 向右拖拉得到Data store read模块,向左拉得到Data write模块 理解:可视为定义变量…...
java设计模式学习之【装饰器模式】
文章目录 引言装饰器模式简介定义与用途实现方式 使用场景优势与劣势装饰器模式在Spring中的应用画图示例代码地址 引言 在日常生活中,我们常常对基本事物添加额外的装饰以增强其功能或美观。例如,给手机加一个保护壳来提升其防护能力,或者在…...
Ubuntu宝塔面板本地部署Emlog个人博客网站并远程访问【内网穿透】
文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道(云端设置)2.3.Cpolar稳定隧道(本地设置) 3. 公网访问测试总结 前言 博客作为使…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
CMake基础:构建流程详解
目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
CocosCreator 之 JavaScript/TypeScript和Java的相互交互
引擎版本: 3.8.1 语言: JavaScript/TypeScript、C、Java 环境:Window 参考:Java原生反射机制 您好,我是鹤九日! 回顾 在上篇文章中:CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
