正则表达式(5):常用符号
正则表达式(5):常用符号
- 小结
本博文转载自
在本博客中,”正则表达式”为一系列文章,如果你想要从头学习怎样在Linux中使用正则,可以参考此系列文章,直达链接如下:
在Linux中使用正则表达式
“正则”系列的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。
之前已经总结了怎样利用正则表达式去”匹配位置”或者”匹配连续次数”,此处,我们来总结一下正则中其他的一些常用符号。
在开始学习新知识之前,我们先回顾一下之前使用过的一个符号,它就是”.”
之前说过,在正则表达式中,”.”表示匹配任意单个字符(换行符除外),示例如下。

示例中的正则表示,只要a字母后面跟随任意3个字符,即可被正则表达式匹配到。
正如上图所示,字母a后面跟随的3个字符可以是”数字”,或者是”字母”,再或者是”符号”,都可以,因为”.”表示任意单个字符,”任意”就体现在这里了。
如果我们想要更加”细致”一些呢?
比如,我们仍然想要从文本中找出a字母后面跟随3个字符的字符串,但是,我们对后面跟随的3个字符有要求,并不能是任意3个字符,而必须是三个字母,我们该怎么做呢?
没错,这个问题会引出我们将要认识的新符号,它就是 “[[:alpha:]]”
在正则表达式中,[[:alpha:]] 表示”任意字母”(不区分大小写)
[[:alpha:]] 这个符号看上去略微有点复杂,但是不要害怕,习惯了就好,其实,”[[:alpha:]]” 可以拆开成几部分去理解,我们后面再聊。
我们先来实验一下,示例如下。

上例中,”[[:alpha:]]{3}”表示3个连续的任意字母,此处结合了之前的知识,其中”{3}” 表示其前面的字符连续出现3次(如果你没有看懂,请回顾前文),所以,上述正则表达式整体的含义就是, 只有a字母后面跟随了3个字母的字符串才会被匹配到,如果a字母后面跟随的3个字符中包含非字母(数字或符号),就不会被匹配到,正如上图所示。
所以,使用[[:alpha:]]可以匹配到不区分大小写的字母,没错,alpha的读音你应该很熟悉了,就是”阿尔法狗”的”阿尔法”。
那么,我们再”细化”一点,我们不仅要字母a后面跟随的3个字符是字母,我们还要求,这3个字符必须是小写字母,我们该怎么办呢?
我们可以使用另外一个符号,它就是”[[:lower:]]”
[[:lower:]]表示任意小写字母,我们来试试。

可以看到,只有当a后面的3个字符均为小写字母时,才会被匹配到。
我们已经学会了怎样表示”不区分大小写的字母”和”小写字母”,那么怎样表示”大写字母”呢?
我们可以使用[[:upper:]]表示任意大写字母,示例如下。

聪明如你,一定已经发现了一些规律,规律就是,我们替换”[[: :]]”中的单词,即可表示不同的含义。
那么我们来看看一些常用的符号都表示什么含义。
[[:alpha:]] 表示任意大小写字母
[[:lower:]] 表示任意小写字母
[[:upper:]] 表示任意大写字母
[[:digit:]] 表示0到9之间的任意单个数字(包括0和9)
[[:alnum:]] 表示任意数字或字母
[[:space:]] 表示任意空白字符,包括”空格”、”tab键”等。
[[:punct:]] 表示任意标点符号
好了,了解了上述符号的含义后,你可以自己创建一个测试文件,进行测试,快点动手试试吧,我相信亲自实验获得的理解肯定更加深刻。
之前,我们使用”[[:lower:]]”表示任意一个小写字母,其实,还有另外一种方法,也能够表示”任意单个小写字母”。
除了”[[:lower:]]”,”[a-z]”也能表示任意一个小写字母,你一定猜出来了,没错,”[a-z]”所表示的意思就是,从a到z的26个小写英文字母中的任意一个。
所以,[a-z]与[[:lower:]]是等价的。
同理,[A-Z]也能表示任意一个大写字母,[A-Z]与[[:upper:]]是等价的,示例如下。

有了之前的基础,你猜猜,”[a-zA-Z]”表示什么意思?
没错,”[a-zA-Z]”表示任意字母,不区分大小写。
[a-zA-Z]与[[:alpha:]]等效。
同理,[0-9]与[[:digit:]]等效,都表示0到9之间的任意单个数字,示例如下。

我们已经了解到,[a-z]表示任意一个小写字母,其实,”[a-z]”外侧的方括号有特殊的含义。
方括号在正则中代表什么意思呢?
“[ ]”表示匹配指定范围内的任意单个字符,这样说可能不容易理解,我们来动手实验一下,就能秒懂,示例如下。

可以看到,字母b后面跟随字母c、或者跟随字母e、或者跟随字母g,都可以被匹配到,”[ceg]”表示c或者e或者g中的任何一个字母都能被匹配到。
那么活学活用,”[Bd#3]”表示什么意思呢?
[Bd#3]表示字符是大写B、或者是小写d、或者是符号#、再或者是数字3,都可以被匹配到,示例如下

“[ ]”表示匹配指定范围内的任意单个字符,换句话说,就是字符与方括号”[ ]”内的任意一个字符相同,就可以被匹配到。
我们了解了方括号的含义以后,再回过头看之前的符号,会有新发现。
上文说过,[0-9]表示0到9之间的任意一个数字,其实,[0-9]就相当于[0123456789]
同理,[a-z]表示a到z之间的任意一个字母,其实,[a-z]就相当于[abcdefghijklmnopqrstuvwxyz]
之前说过,[[:alpha:]]代表单个任意的字母,前文也提到过,[[:alpha:]]可以拆开去理解,聪颖如你一定想到了,我们可以把[[:alpha:]]拆成两部分理解。
第一部分:最外层的[ ],表示指定范围内的任意单个字符
第二部分:最内层的[:alpha:],表示不区分大小写的字母
所以,当两部分结合在一起时,就变成了[[:alpha:]],就表示任意单个字母(不区分大小写),[[:digit:]]等其他类似符号也可以这样拆开来理解。
我们已经理解了方括号”[ ]”的含义,我们再来认识一个它的孪生兄弟,它就是 “[^ ]”
“[^ ]”表示匹配指定范围外的任意单个字符,注意,它与”[ ]”的含义正好相反。
“[ ]”表示匹配指定范围内的任意单个字符。
如果你觉得不好理解,可以先看示例,示例如下:

如上图所示,字母f后面跟随的字母只要不是a、c、e、g中的任何一个,即可被匹配到,相当于排除了a、c、e、g这些字母。
所以,”[^ ]”表示匹配指定范围外的任意单个字符
我们之前说过,”^”符号的含义为锚定行首,但是,当它与”[ ]”结合在一起的时候,则没有锚定行首之意,只能把”[^ ]”当做一个整体去看待,可以把此处的 “^”理解为取反。
既然”[ ]”与”[^ ]”是相对的,那么,能不能把[0-9]改写成[^0-9]呢?必须能啊。
“[^0-9]”表示匹配单个非数字字符,与[0-9]的含义这正好相反,示例如下。

如上图所示,只要字母e后面跟随的字符不是数字,就可以被匹配到。
同理:
[^a-z]表示非小写字母的单个字符可以被匹配到。
[^A-Z]表示非大写字母的单个字符可以被匹配到。
[^a-zA-Z]表示非字母的单个字符可以被匹配到,比如数字或符号。
[^a-zA-Z0-9]表示非字母、非数字的单个字符可以被匹配到,比如符号。
结合之前的理论,你一定想到了,既然[0-9]与[[:digit:]]等效,那么[^0-9]与[^[:digit:]]等效吗?
试试就知道了,如下图所示,的确是等效的。

举一反三
[^0-9]与[^[:digit:]]等效
[^a-z]与[^[:lower:]]等效
[^A-Z]与[^[:upper:]]等效
[^a-zA-Z]与[^[:alpha:]]等效
[^a-zA-Z0-9]与[^[:alnum:]]等效
其实,不仅[0-9]与[[:digit:]]能够表示数字,还有一些简写格式的符号也能表示数字,比如”\d”
但是,并不是所有的正则表达式处理器都能够识别这些简写格式
示例如下

如上图所示,默认情况下,grep就无法识别”\d”这种简短格式,所以上图中,没有匹配到任何结果。
如果我们想要让grep能够识别这种简短格式,可以使用-P选项,表示grep使用兼容perl的正则表达式引擎,示例如下。

我想,有了前面的基础,再理解这些简写格式,应该相对容易了。
所以,此处直接列出一些常用的简写格式的符号,不再赘述了,大家可以动手实验一下。
\d 表示任意单个0到9的数字
\D 表示任意单个非数字字符
\t 表示匹配单个横向制表符(相当于一个tab键)
\s表示匹配单个空白字符,包括”空格”,”tab制表符”等。
\S表示匹配单个非空白字符
小结
为了方便以后回顾,我们将上述知识点总结一下。
如果你不明白下述描述,请回顾上述示例。
. 表示匹配任意单个字符
* 表示匹配前面的字符任意次,包括0次
[ ] 表示匹配指定范围内的任意单个字符
[^ ] 表示匹配指定范围外的任意单个字符[[:alpha:]] 表示任意大小写字母
[[:lower:]] 表示任意小写字母
[[:upper:]] 表示任意大写字母
[[:digit:]] 表示0到9之间的任意单个数字(包括0和9)
[[:alnum:]] 表示任意数字或字母
[[:space:]] 表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]] 表示任意标点符号[0-9]与[[:digit:]]等效
[a-z]与[[:lower:]]等效
[A-Z]与[[:upper:]]等效
[a-zA-Z]与[[:alpha:]]等效
[a-zA-Z0-9]与[[:alnum:]]等效[^0-9]与[^[:digit:]]等效
[^a-z]与[^[:lower:]]等效
[^A-Z]与[^[:upper:]]等效
[^a-zA-Z]与[^[:alpha:]]等效
[^a-zA-Z0-9]与[^[:alnum:]]等效#简短格式并非所有正则表达式解析器都可以识别
\d 表示任意单个0到9的数字
\D 表示任意单个非数字字符
\t 表示匹配单个横向制表符(相当于一个tab键)
\s表示匹配单个空白字符,包括"空格","tab制表符"等
\S表示匹配单个非空白字符
这篇文章就总结到这里,希望能够帮助到你~~
相关文章:
正则表达式(5):常用符号
正则表达式(5):常用符号 小结 本博文转载自 在本博客中,”正则表达式”为一系列文章,如果你想要从头学习怎样在Linux中使用正则,可以参考此系列文章,直达链接如下: 在Linux中使用正…...
Web安全漏洞分析-XSS(下)
随着互联网的迅猛发展,Web应用的普及程度也愈发广泛。然而,随之而来的是各种安全威胁的不断涌现,其中最为常见而危险的之一就是跨站脚本攻击(Cross-Site Scripting,简称XSS)。XSS攻击一直以来都是Web安全领…...
金南瓜SECS/GEM C# SDK 快速使用指南
本文对如何使用金南瓜SECS/GEM C# SDK 快速创建一个满足SECS/GEM通信要求的应用程序,只需简单3步完成。 第一步:创建C# .NET程序 示例使用Visual Studio 2010,使用者可以选择更高级版本 Visual Studio 第二步:添加DLL库引用&am…...
在一个没有超级用户的mongodb 生产库上如何添加超级用户
说来这个问题,都觉得不可思议,一个数据库怎么没有超级用户呢,我们知道,MYSQL,PG,ORACLE等,创建好后,都有一个默认的超级用户,MONGODB也有超级用户,但需要自己…...
排序算法之二:冒泡排序
冒泡排序的思路 冒泡排序是交换排序 基本思想:所谓交换,就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置,交换排序的特点是:将键值较大的记录向序列的尾部移动,键值较小的记录向序列的前部移动…...
一键搭建你的hnust请假条
hnust请假条 湖南科技大学请假条生成器 https://hnust.rick.icu/new (直接使用) Hnust Leave Note 去github https://github.com/rickhqh/hnust_leave_note 效果展示 界面展示效果图 v2.0 更新 vant和vue重构了整个源码同步学校新版请假条样式修复了…...
C练习题13
单项选择题(本大题共20小题,每小题2分,共40分。在每小题给出的四个备选项中,选出一个正确的答案,并将所选项前的字母填写在答题纸的相应位置上。) 1.结构化程序由三种基本结构组成、三种基本结构组成的算法是() A.可以完成任何复杂的任务 B. 只能完成部分复杂的任务 C. 只能完…...
交易历史记录20231206 记录
昨日回顾: select top 10000 * from dbo.CODEINFO A left join dbo.全部A股20231206010101 B ON A.CODE B.代码 left join dbo.全部A股20231206CONF D on A.CODED.代码left join dbo.全部A股20231206 G on A.CODEG.代码 left…...
1-5总体分布的推断
...
深信服技术认证“SCSA-S”划重点:XSS漏洞
为帮助大家更加系统化地学习网络安全知识,以及更高效地通过深信服安全服务认证工程师考核,深信服特别推出“SCSA-S认证备考秘笈”共十期内容,“考试重点”内容框架,帮助大家快速get重点知识~ 划重点来啦 *点击图片放大展示 深信服…...
MIT6S081-Lab2总结
大家好,我叫徐锦桐,个人博客地址为www.xujintong.com,github地址为https://github.com/xjintong。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家访问。 Lab2就是了解一下xv6的系统调用流程&…...
CMMI5大成熟度等级和4大过程域
CMMI(Capability Maturity Model Integration,能力成熟度模型集成)模型系列是帮助组织改进其过程的最佳实践的集合。这些模型由来自产业界、政府以及软件工程研究所(Software Engineering Institute, SEI)的…...
c++新经典模板与泛型编程:const修饰符的移除与增加
const修饰符的移除 让你来写移除const修饰符,你会怎么样来写? 😂😂trait类模板,如下 #include <iostream>// 泛化版本 template<typename T> struct RemoveConst {using type T; };// 特化版本 template…...
AUTOSAR汽车电子嵌入式编程精讲300篇-基于加密算法的车载CAN总线安全通信
目录 前言 研究现状 系统架构研究 异常检测研究 认证与加密研究 相关技术 2.1车联网 2.2车载网络及总线 2.2.1 CAN总线基础 2.2.2 CAN总线网络安全漏洞 2.2.3 CAN总线信息安全需求 2.3密码算法 2.3.1 AES算法 2.3.2 XTEA算法 CAN网络建模与仿真 3.1 CAN网络建模…...
4-Docker命令之docker start
1.docker start介绍 docker start命令是用来启动一个或多个已经被停止的docker容器。 2.docker start用法 docker start [参数] container [container......] [root@centos79 ~]# docker start --helpUsage: docker start [OPTIONS] CONTAINER [CONTAINER...]Start one or…...
AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 2 “架构 AWS”
接续上一章节,我们把开发环境架设好之后,此章节叙述如何建立 AWS IoT 环境,请务必已经有 AWS Account,申请 AWS Account 之流程将不在此说明。 III-1. 登入AWS IoT, 在“管理”>“所有装置”>“实物”下点击“建…...
日志框架梳理(Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2)
原文链接 日志框架发展历程 在了解日志框架时总会列出一系列框架:Log4j,Reload4j,JUL,JCL,SLF4J,Logback,Log4j2,这么多框架让人感到混乱,该怎么选取、该怎么用。接下来…...
内核无锁队列kfifo
文章目录 1、抛砖引玉2、内核无锁队列kfifo2.1 kfifo结构2.2 kfifo分配内存2.3 kfifo初始化2.4 kfifo释放2.5 kfifo入队列2.6 kfifo出队列2.7 kfifo的判空和判满2.8 关于内存屏障 1、抛砖引玉 昨天遇到这样一个问题,有多个生产者,多个消费者,…...
18、XSS——cookie安全
文章目录 1、cookie重要字段2、子域cookie机制3、路径cookie机制4、HttpOnly Cookie机制5、Secure Cookie机制6、本地cookie与内存cookie7、本地存储方式 一般来说,同域内浏览器中发出的任何一个请求都会带上cookie,无论请求什么资源,请求时&…...
从零开发短视频电商 Jmeter压测示例模板详解(无认证场景)
文章目录 添加线程组添加定时器添加HTTP请求默认值添加HTTP头管理添加HTTP请求添加结果断言响应断言 Response AssertionJSON断言 JSON Assertion持续时间断言 Duration Assertion 添加察看结果树添加聚合报告添加表格察看结果参考 以压测百度搜索为例 https://www.baidu.com/s…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
