正则表达式(9):扩展正则表达式

正则表达式(9):扩展正则表达式

      • 小结

本博文转载自

前文中一直在说,在Linux中,正则表达式可以分为”基本正则表达式”和”扩展正则表达式”。

我们已经认识了”基本正则表达式”,现在,我们来认识一下”扩展正则表达式”。

有了之前的基础,学习”扩展正则表达式”简直不要太轻松。

之前说过,有些符号是通用的,不管是在”基本正则表达式”中,还是在”扩展正则表达式”中,这些通用的符号所表达的意思都是相同的。

那么,我们先来看看哪些符号是通用的,看完之后你会信心大增,如下字符都是通用的:

.   表示任意单个字符。
*  表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\  表示转义符,当与正则表达式中的符号结合时表示符号本身。
[  ]表示匹配指定范围内的任意单个字符。
[^  ]表示匹配指定范围外的任意单个字符。[[:alpha:]]  表示任意大小写字母。
[[:lower:]]  表示任意小写字母。
[[:upper:]]  表示任意大写字母。
[[:digit:]]  表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]]  表示任意数字或字母。
[[:space:]]  表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]]  表示任意标点符号。
[^[:alpha:]]  表示单个非字母字符。
[^[:lower:]]  表示单个非小写字母字符。
[^[:upper:]]  表示单个非大写字母字符。
[^[:digit:]]  表示单个非数字字符。
[^[:alnum:]]  表示单个非数字非字母字符。
[^[:space:]]  表示单个非空白字符。
[^[: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:]]等效^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。

上述符号,在基本正则表达式中与扩展正则表达式中的用法完全相同。

有没有感觉,70%都是通用的,那么我们来动手试试。

在总结grep命令时,我们提到过,grep命令默认只支持基本正则表达式,如果想要让grep命令能够支持扩展的正则表达式,则需要使用”-E”选项,示例如下

在这里插入图片描述

上图中,grep命令使用了”-E”选项,表示grep命令会把”正则表达式”中的符号当成”扩展正则表达式”去理解,而不再使用默认的”基本正则表达式”。

但是由于”[A-Z]”是通用的,所以,不管是否使用扩展正则表达式,”[A-Z]”都表示单个大写字母。

刚才说过,70%的符号都是通用的,那么剩下的30%呢?

其实,剩下的30%也都差不多,与基本正则表达式相比,反而更加简单了,不信?我们就来看看。

在基本正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。

在扩展正则表达式中,{n} 表示前面的字符连续出现n次,将会被匹配到。

在基本正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。

在扩展正则表达式中,( ) 表示分组,(ab) 表示将ab当做一个整体去处理。

在写法上,”扩展正则表达式”的写法是不是更加简练呢?示例如下

在这里插入图片描述

如上图所示,当使用”扩展正则表达式”时,在”书写”方面,反而省力不少,最终匹配到的文本却是相同的,是不是很方便?

看完了上述示例,我想你对扩展正则表达式应该已经有了一个初步的印象了。

那么,我们就来介绍一下,有哪些符号在”扩展正则表达式”中变得更加简练了。

在扩展正则表达式中:

( ) 表示分组

(ab) 表示将ab当做一个整体去处理。

\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。

\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。

? 表示匹配其前面的字符0或1次

  • 表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。

{n} 表示前面的字符连续出现n次,将会被匹配到。

{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,即可被匹配到。

{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。

{n,}表示之前的字符连续出现至少n次,才会被匹配到。

看了上述总结以后,是不是已经想要放弃使用”基本正则表达式”了呢?因为与之相比,扩展正则表达式才更符合我们这些懒人的习惯,而且,扩展正则表达式的可读性也更高,毕竟很多符号少了前面的”\”,可读性就变强了。

扩展正则表达式中,还有一个常用的符号,它就是”|” (在基本正则表达式中使用 “\|”, 前面没有讲, 这里补上)

注:按住键盘的 “shift键” 和 “\”键 ,就可以打出”|”

“|”在扩展正则表达式中,表示”或”,这样说不容易理解,我们来看个小例子,就能明白,示例文件内容如下。

在这里插入图片描述

如果,我们想要从上例文本中找到以”com”结尾的行,我们该怎么办呢?我们可以使用如下命令。

在这里插入图片描述

同理,如果我们想要从示例文本中找出以”net”结尾的行,可以使用如下命令。

在这里插入图片描述

那么,如果我们想要从示例文本找出,以”com”结尾,或者以”net”结尾的行,我们该怎么办呢?

这时候,我们就需要用到”|”

“|”在扩展正则表达式中表示”或者”,所以,我们可以使用如下表达式

在这里插入图片描述

上图中的扩展正则使用了分组符号”( )”,”(com|net)”表示将括号内的内容看做一个整体,而括号内的内容为”com|net”,它表示”com或者net”,所以,”(com|net)$”就表示以com或者net结尾的行。是不是很简单?

那么,我们就趁热打铁,通过实际练习,来熟悉一下”扩展正则表达式”吧。

仍然以刚才的示例文件作为测试文件,假设,我们想要查找出测试文本中的”合法邮箱”,我们应该怎么做呢?

既然是要找出”合法邮箱”,那么,我们则必须事先定义,满足哪些条件的邮箱才属于合法邮箱。

所以,我们规定,如果一个邮箱属于合法邮箱,那么必须满足如下条件。

1、邮箱字符串中必须包含”@”符。

2、”@”符前面的字符只能是小写字母或数字,不能包含特殊符号。

3、”@”符前面的字符数量至少需要4个,至多为16个。

4、邮箱必须以”com”、”net”、”org”、”edu”等顶级域名结尾(此处为了方便演示,不判断更多的域名)。

5、顶级域名之前必须包含一个”点”,换句话说就是,邮箱必须以”.com”、”.net”、”.org”、”.edu”结尾。

6、”@”与”.”之间的字符数量不能超过12个,不能低于2个。

7、”@”与”.”之间的字符只能是小写字母或数字,不能包含特殊符号。

好了,了解了合法邮箱的规则以后,我们就可以开始编写正则表达式了,我们可以使用如下正则,查找文本中的合法邮箱。

在这里插入图片描述

如果你觉得上述正则稍微有些复杂,不容易理解,那么可以将其拆分成几个部分去理解,拆分后的每一部分,可以与之前的”合法邮箱条件”一一对应,如下图所示。

在这里插入图片描述

这样看,是不是容易理解多了,好了,赶快自己动手实验一下吧。

小结

我认为,有了之前基础的你,搞定”扩展正则表达式”,肯定是分分钟的事情,所以,我们就对”扩展正则表达式”进行一下总结吧。

常用符号
.   表示任意单个字符。
*  表示前面的字符连续出现任意次,包括0次。
.* 表示任意长度的任意字符,与通配符中的*的意思相同。
\  表示转义符,当与正则表达式中的符号结合时表示符号本身。
| 表示"或者"之意
[  ]表示匹配指定范围内的任意单个字符。
[^  ]表示匹配指定范围外的任意单个字符。单个字符匹配相关
[[:alpha:]]  表示任意大小写字母。
[[:lower:]]  表示任意小写字母。
[[:upper:]]  表示任意大写字母。
[[:digit:]]  表示0到9之间的任意单个数字(包括0和9)。
[[:alnum:]]  表示任意数字或字母。
[[:space:]]  表示任意空白字符,包括"空格"、"tab键"等。
[[:punct:]]  表示任意标点符号。
[^[:alpha:]]  表示单个非字母字符。
[^[:lower:]]  表示单个非小写字母字符。
[^[:upper:]]  表示单个非大写字母字符。
[^[:digit:]]  表示单个非数字字符。
[^[:alnum:]]  表示单个非数字非字母字符。
[^[:space:]]  表示单个非空白字符。
[^[: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:]]等效次数匹配相关
?  表示匹配其前面的字符0或1次
+  表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
{n} 表示前面的字符连续出现n次,将会被匹配到。
{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只
要之前的字符连续出现的次数在x与y之间,即可被匹配到。
{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。
{n,}表示之前的字符连续出现至少n次,才会被匹配到。位置边界匹配相关
^:表示锚定行首,此字符后面的任意内容必须出现在行首,才能匹配。
$:表示锚定行尾,此字符前面的任意内容必须出现在行尾,才能匹配。
^$:表示匹配空行,这里所描述的空行表示"回车",而"空格"或"tab"等都不能算作此处所描述的空行。
^abc$:表示abc独占一行时,会被匹配到。
\<或者\b :匹配单词边界,表示锚定词首,其后面的字符必须作为单词首部出现。
\>或者\b :匹配单词边界,表示锚定词尾,其前面的字符必须作为单词尾部出现。
\B:匹配非单词边界,与\b正好相反。分组与后向引用
( ) 表示分组,我们可以将其中的内容当做一个整体,分组可以嵌套。
(ab) 表示将ab当做一个整体去处理。
\1 表示引用整个表达式中第1个分组中的正则匹配到的结果。
\2 表示引用整个表达式中第2个分组中的正则匹配到的结果。

那么什么时候使用基本正则表达式、什么时候使用扩展正则表达式呢?
这是一个仁者见仁的话题, 个人认为:
当出现2处或者2处以上使用“\”(反斜杆转义)的正则, 则使用扩展正则。

基本正则表达式与扩展正则表达式的区别:
区别主要是有几个部分可以不使用反斜杆转义.
如下:

1. 分组;  
基本正则表达式: \(\)
扩展正则表达式: ()2. 或
基本正则表达式: \|
扩展正则表达式: |3. 次数匹配相关
基本正则表达式:
\?  表示匹配其前面的字符0或1次
\+  表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
\{n\} 表示前面的字符连续出现n次,将会被匹配到。
\{x,y\} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只要之前的字符连续出现的次数在x与y之间,
即可被匹配到。
\{,n\} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。
\{n,\}表示之前的字符连续出现至少n次,才会被匹配到。扩展正则表达式:
?  表示匹配其前面的字符0或1次
+  表示匹配其前面的字符至少1次,或者连续多次,连续次数上不封顶。
{n} 表示前面的字符连续出现n次,将会被匹配到。
{x,y} 表示之前的字符至少连续出现x次,最多连续出现y次,都能被匹配到,换句话说,只
要之前的字符连续出现的次数在x与y之间,即可被匹配到。
{,n} 表示之前的字符连续出现至多n次,最少0次,都会陪匹配到。
{n,}表示之前的字符连续出现至少n次,才会被匹配到。

关于”扩展正则表达式”,就总结到这里,希望能够帮助到你~~

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

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

相关文章

T天池SQL训练营(五)-窗口函数等

–天池龙珠计划SQL训练营 5.1窗口函数 5.1.1窗口函数概念及基本的使用方法 窗口函数也称为OLAP函数。OLAP 是OnLine AnalyticalProcessing 的简称&#xff0c;意思是对数据库数据进行实时分析处理。 为了便于理解&#xff0c;称之为窗口函数。常规的SELECT语句都是对整张表进…

Python:核心知识点整理大全11-笔记

目录 ​编辑 6.2.4 修改字典中的值 6.2.5 删除键—值对 注意 删除的键—值对永远消失了。 6.2.6 由类似对象组成的字典 6.3 遍历字典 6.3.1 遍历所有的键—值对 6.3.2 遍历字典中的所有键 往期快速传送门&#x1f446;&#xff08;在文章最后&#xff09;&#xff1a; 6.…

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端

风力发电对讲 IP语音对讲终端IP安防一键呼叫对讲 医院对讲终端SV-6005网络音频终端 目 录 1、产品规格 2、接口使用 2.1、侧面接口功能 2.2、背面接口功能 2.3、面板接口功能 3、功能使用 1、产品规格 输入电源&#xff1a; 12V&#xff5e;24V的直流电源 网络接口&am…

PID控制参数整定(调节方法)原理+图示+MATLAB调试

PID控制参数整定&#xff08;调节方法&#xff09;原理图示MATLAB调试 Chapter1 PID控制参数整定&#xff08;调节方法&#xff09;原理图示MATLAB调试序一、P参数选取二、I的调节三、D的调节四、总结 Chapter2 PID参数调整&#xff0c;个人经验&#xff08;配输出曲线图&#…

【51单片机系列】独立按键介绍

本文是关于独立按键的介绍及使用。首先介绍了按键&#xff0c;包括什么是按键及使用按键时如何实现软件消抖。然后使用proteus仿真实现独立按键控制LED指示灯的操作。 之前的LED、蜂鸣器、数码管中IO口都是作为输出使用&#xff0c;这里通过独立按键实验介绍IO口作为输入的使用…

Edge 中的msedgewebview2总想联网

目录预览 一、问题描述二、原因分析三、解决方案四、参考链接 一、问题描述 使用Edge浏览器的时候&#xff0c;右下角火绒总会弹出“msedgewebview2”想要联网的弹窗&#xff0c;如下 点击发起程序&#xff0c;找到路径如下&#xff1a; C:\Program Files (x86)\Microsoft\…

zabbix 进阶

zabbix的字段发现机制&#xff1a; zabbix客户端主动和服务端联系&#xff0c;将自己的地址和端口发送服务端实现字段添加监控主机。 客户端是主动一方。 缺点&#xff1a;自定义网段中主机数量太多&#xff0c;登记耗时会很久&#xff0c;而且这个自动发现机制不是很稳定。…

【Docker一】Docker架构、镜像操作和容器操作

一、docker基本管理和概念 1、概念 docker&#xff1a;开源的应用容器引擎。基于go语言开发的。运行在Linux系统中的开源的轻量级的“虚拟机” docker的容器技术可用在一台主机上轻松到达为任何应用创建一个轻量级到的&#xff0c;可移植的&#xff0c;自给自足的容器 dock…

免费的数据采集软件,最新免费的几款数据采集软件【2024】

在当今数字化时代&#xff0c;数据是企业决策和业务发展的关键。而如何高效获取数据成为许多企业和研究机构的关注焦点。本文将深入探讨数据采集软件的种类。帮助大家选择最适合自己需求的数据采集工具。 数据采集软件种类 在众多数据采集软件中&#xff0c;有一类强大而多样…

postgresql自带指令命令系列二

简介 在安装postgresql数据库的时候会需要设置一个关于postgresql数据库的PATH变量 export PATH/home/postgres/pg/bin:$PATH&#xff0c;该变量会指向postgresql安装路径下的bin目录。这个安装目录和我们在进行编译的时候./configure --prefix [指定安装目录] 中的prefix参…

基于ssm理发店会员管理系统的设计和实现论文

摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管理就很关键。因此理发店会员信息…

Cache的基本概念和原理

目录 一. Cache的工作原理二. 局部性原理三. 性能分析四. 待解决的问题 \quad 一. Cache的工作原理 \quad 存储系统存在的问题 虽然双端口RAM、多模块存储器提高存储器的工作速度, 但是优化后的速度与CPU差距依然很大, 为了改善这个问题就出现了Cache, 来解决存储器与CPU速度不…

ubuntu安装docker及docker常用命令

docker里有三个部分 daemon 镜像 和 容器 我们需要了解的概念 容器 镜像 数据卷 文章目录 docker命令docker镜像相关命令docker容器相关命令数据卷ubuntu安装docker docker命令 #启动&#xff0c;停止&#xff0c;重启docker systemctl start docker systemctl stop docker s…

SpringBoot的依赖管理和自动配置

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 依赖管理机制2 自动配置机制2.1 初步理解2.2 完整流程 &#x1f48e;总结 1 依赖管理机制 为什么导入starter-web后所有相关依赖都会导入进来&#xff1f; 开发什么场景&#xff0c;导入什么场景启动器-spring-bo…

Redis 环境搭建2

文章目录 第2关&#xff1a;使用 Redis 第2关&#xff1a;使用 Redis 本文是接着上篇文章写的第二关代码&#xff0c;部分人再进入第二关时不会保留第一关的配置的环境&#xff0c;可以通过下面一句代码进行检验。 redis-cli -p 7001 -c如果进入到了redis界面就是有环境&…

问题:batchnormal训练单个batch_size就会报错吗

Batch Normalization&#xff08;批标准化&#xff09;是一种深度学习中的正则化技巧&#xff0c;它可以改进网络的训练过程。在训练神经网络时&#xff0c;Batch Normalization可以帮助解决内部协变量偏移&#xff08;Internal Covariate Shift&#xff09;的问题。 在标准的…

pytorch serve开始-Getting started

官网链接 Getting started — PyTorch/Serve master documentation 安装TorchServe和torch-model-archiver 安装依赖 注意::对于Conda&#xff0c;运行Torchserve需要Python >3.8。 对于基于Debian的系统/ MacOS CPU python ./ts_scripts/install_dependencies.py 对…

【Hadoop】高可用集群搭建

知识目录 一、写在前面&#x1f495;二、Zookeeper安装✨三、Hadoop配置✨四、Hadoop HA自动模式✨五、HA脚本分享✨七、结语&#x1f495; 一、写在前面&#x1f495; 大家好&#xff01;这篇文章是我在搭建Hdfs的HA(高可用)时写下的详细笔记与感想&#xff0c;希望能帮助到大…

Notes数据直接在Excel中统计

大家好&#xff0c;才是真的好。 我希望你看过前面两篇内容《Domino REST API安装和运行》和《Domino REST API安装和运行》&#xff0c;因为今天我们正是使用REST API方式在Excel中查询和统计Notes数据。 不过首先你得知道一个OData协议&#xff0c;全名Open Data Protocol(…

布隆过滤器,Redis之 bitmap,场景题【如果微博某个大V发了一条消息,怎么统计有多少人看过了】

文章目录 一、什么是 bitmap1-1、Bitmap 相关命令二、bitmap 和 set 对比2-1、数据准备2-2、内存对比2-3、性能对比三、布隆过滤器3-1、理论主要作用如何将数据放到过滤器内呢?注意事项布隆过滤器 有两个重要的参数3-2、代码实现3-3、Java中的hash函数最近面试,面试官问了一个…