正则表达式(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表示匹配单个非空白字符

这篇文章就总结到这里,希望能够帮助到你~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode刷题详解——最长湍流子数组

1. 题目链接:978. 最长湍流子数组 2. 题目描述: 给定一个整数数组 arr ,返回 arr 的 最大湍流子数组的长度 。 如果比较符号在子数组中的每个相邻元素对之间翻转,则该子数组是 湍流子数组 。 更正式地来说,当 arr 的子…

简单易懂:Axios 如何取消请求的两种方法

在前端开发中,网络请求是非常常见的操作。而有时候,我们可能需要在发送请求后取消它,比如用户在请求还未完成时离开了当前页面或者执行了其他操作,本文将介绍如何在使用 Axios 发送请求时取消这些请求。 基本概念 在 Axios 中&am…

WindowsServer服务器系列:定时备份 MySQL

一、编写脚本 echo 取日期、时间变量值 set yy%date:~0,4% set mm%date:~5,2% set dd%date:~8,2% if /i %time:~0,2% lss 10 set hh0%time:~1,1% if /i %time:~0,2% geq 10 set hh%time:~0,2% set mn%time:~3,2% set ss%time:~6,2% set date%yy%%mm%%dd% set time%hh%%mn%%ss…

DAPP开发【10】express.js的使用

Express.js 是一种流行、轻量级的开源 Web 应用程序框架,用于开发基于 Node.js 的服务器端 Web 应用程序。它提供了强大的功能集,适用于 Web 和移动应用程序。Express.js 旨在支持单页、多页和混合式 Web 应用程序的开发。Express.js 提供了广泛的功能&a…

2022年第十一届数学建模国际赛小美赛A题翼龙如何飞行解题全过程文档及程序

2022年第十一届数学建模国际赛小美赛 A题 翼龙如何飞行 原题再现: 翼龙是翼龙目中一个已灭绝的飞行爬行动物分支。它们存在于中生代的大部分时期:从三叠纪晚期到白垩纪末期。翼龙是已知最早进化出动力飞行的脊椎动物。它们的翅膀是由皮肤、肌肉和其他组…

python学习之JSON数据处理在Python中的应用:从解析到生成

JSON文件是一种轻量级的数据交换格式,它采用了一种类似于JavaScript语法的结构,可以方便地在不同平台和编程语言之间进行数据交换。在Python中,我们可以使用内置的json模块来读取和写入JSON文件。 下面是一个简单的示例,展示了如…

【基于openGauss5.0.0简单使用DBMind】

基于openGauss5.0.0简单使用DBMind 一、环境说明二、初始化tpch测试数据三、使用DBMind索引推荐功能四、使用DBMind实现SQL优化功能 一、环境说明 虚拟机:virtualbox操作系统:openEuler 20.03 TLS数据库:openGauss-5.0.0DBMind:d…

短剧分销小程序/APP开发:开启短剧收益时代

今年,短剧火爆出圈,市场规模将达至200亿元至300亿元。国内全全平台付费短剧日充值金额为6000万元,短剧作为一种“快餐式”文化迅速爆火。 短剧契合了观众娱乐时间碎片化的发展趋势,相比于传统的电视剧,短剧节奏快、剧…

【链表Linked List】力扣-114 二叉树展开为链表

目录 题目描述 解题过程 官方题解 题目描述 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应…

Android View的 getHeight 和 getMeasuredHeight 的区别

前言 先简单复习一下Android View 的 绘制顺序: 1、onMeasure(测量),先根据构造器传进来的LayoutParams(布局参数),测量view宽高。 2、onLayout(布局),再根…

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#)

Baumer工业相机堡盟工业相机如何通过BGAPISDK将相机图像高速保存到电脑内存(C#) Baumer工业相机Baumer工业相机图像保存到电脑内存的技术背景代码分析注册SDK回调函数BufferEvent声明可以存储相机图像的内存序列和名称在图像回调函数中将图像保存在内存序…

C#核心笔记——(三)在C#中创建类型

3.1 类 类是最常见的一种引用类型,最简单的类的声明如下: class MyClass{}而复杂的类可能包含如下内容: 1.在class关键字之前:类的特性(Attribute)和修饰符。非嵌套的类修饰符有: public、int…

【计算机网络笔记】物理层——基带传输基础

系列文章目录 什么是计算机网络? 什么是网络协议? 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能(1)——速率、带宽、延迟 计算机网络性能(2)…

kyuubi整合flink yarn session mode

目录 概述配置flink 配置kyuubi 配置kyuubi-defaults.confkyuubi-env.shhive 验证启动kyuubibeeline 连接使用hive catlogsql测试 结束 概述 flink 版本 1.17.1、kyuubi 1.8.0、hive 3.1.3、paimon 0.5 整合过程中,需要注意对应的版本。 注意以上版本 配置 ky…

互联网Java工程师面试题·Spring Cloud篇

目录 1、什么是 Spring Cloud? 2、使用 Spring Cloud 有什么优势? 3、服务注册和发现是什么意思?Spring Cloud 如何实现? 4、负载平衡的意义什么? 5、什么是 Hystrix?它如何实现容错? 6、什么是…

SpringBoot读取properties文字乱码问题及相关问题

问题:在idea的编辑器中properties文件一般用UTF-8编码,SpringBoot2读取解码方式默认不是UTF-8,当值出现中文时SpringBoot读取时出现了乱码。 解决方式1:在SpringBoot框架层面解决,在配置类注解上添加encoding属性值为…

【FPGA图像处理实战】- FPGA图像处理仿真测试工程(读写BMP图片)

FPGA开发过程中“行为功能仿真”是非常必要的一个过程,如果仿真都没通过,则上板测试必定失败。 FPGA图像处理需要读写大量的图像数据,单看这些图像数据实际是没有规则的,如果直接上板测试,调试起来非常困难&#xff0…

【Vue】Vue Router 在 Vue2 项目中的简单使用案例

前言 Vue Router 是 Vue.js 官方的路由管理器。它可以帮助我们在 Vue2 项目中实现页面之间的切换和导航。以下是在 Vue2 项目中使用 Vue Router 的简单案例。 步骤 安装 Vue Router 首先,我们需要安装 vue-router 包。你可以使用 npm 或 yarn 安装,打开…

C语言实现植物大战僵尸(完整版)

实现这个游戏需要Easy_X 这个在我前面一篇C之番外篇爱心代码有程序教你怎么下载,大家可自行查看 然后就是需要植物大战僵尸的素材和音乐,需要的可以在评论区 首先是main.cpp //开发日志 //1导入素材 //2实现最开始的游戏场景 //3实现游戏顶部的工具栏…

Elasticsearch 8.9 flush刷新缓存中的数据到磁盘源码

一、相关API的handler1、接收HTTP请求的hander2、每一个数据节点(node)执行分片刷新的action是TransportShardFlushAction 二、对indexShard执行刷新请求1、首先获取读锁,再获取刷新锁,如果获取不到根据参数决定是否直接返回还是等待2、在刷新之后transl…