正则表达式常用语法解析

article/2025/8/26 8:52:04

正则表达式常用语法解析

  • 什么是正则表达式
  • 正则表达式之元字符
    • 匹配位置的元字符 ^、$、/b
    • 匹配字符的元字符 .、\w、\W、\s、\S、\d、\D
  • 正则表达式之文字匹配
    • 字符类
    • 字符转义
    • 反义
  • 正则表达式之限定符
  • 正则表达式之字符的运算
    • 替换
    • 分组
    • 反向引用
    • 零宽度断言
    • 负向零宽度断言
    • 优先级顺序

什么是正则表达式

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式应用广泛,在绝大多数的编程语言都可以完美应用,在Linux中,也有着极大的用处。

使用正则表达式,可以有效的筛选出需要的文本,然后结合相应的支持的工具或语言,完成任务需求。

在本篇博客中,我们使用以下两个在线网站测试
  http://www.regexpal.com/ 这个网站中,我们可以在线测试正则表达式。
  http://regexr.com/ 这个网站更为推荐,它自身还包括了一个实例使我们直接测试。

正则表达式之元字符

正则表达式中元字符恐怕是我们听得最多的了。元字符(Metacharacter)是一类非常特殊的字符,它能够匹配一个位置或者字符集合中的一个字符。 如.、\w等都是元字符。

刚刚说到,元字符既可以匹配位置,也可以匹配字符,那么我们就可以通过此来将元字符分为匹配位置的元字符和匹配字符的元字符。

匹配位置的元字符 ^、$、/b

1.^:匹配行的开始位置
如^zzw匹配的是以"zzw"为行开头的"zzw"(注意:我这里想要表达的是:尽管加了一个^,它匹配的仍是字符串,而不是一整行!),如果zzw不是作为行开头的字符串,则它不会被匹配。
在这里插入图片描述
2.$:匹配行的结尾位置
如zzw$匹配的是以"zzw"为行结尾的"zzw"(同样,这里$只是匹配的一个位置,那个位置是零宽度,而不是一整行),如果zzw不是作为行的结尾,那么它不会被匹配。
在这里插入图片描述
于是结合^和$我们就不难猜测^zzw$匹配的是某行中只有zzw这个字符串了。
在这里插入图片描述
而^$匹配的则是一个空行,这个空行中不包含任何字符串

3.\b匹配单子的开始或结束
如 \bzzw匹配的是zzw之前是空格符号、标点符号或换行符号的zzw(注意:但\b匹配的仅是一个零宽度的位置,而不会匹配空格、标点符号或换行符号)。

而zzw\b匹配的是zzw之后是空格符号、标点符号或换行符号的zzw(同样,\b匹配的是一个零宽度的位置)。

显然 \bzzw\b匹配的就是zzw的前后必须是空格符号、标点符号或换行符号的zzw。
在这里插入图片描述

匹配字符的元字符 .、\w、\W、\s、\S、\d、\D

即匹配字符的元字符共有七个。

其中.(点号)表示匹配除换行符之外的任意字符;

  • \w 匹配单词字符(不仅仅是字母,还有下划线、数字和汉字);\W匹配任意的非单词字符(注意,- 与\w刚好相反);
  • \s匹配的是任意的空白字符(如空格、制表符、换行符、中文全角空格等);
  • \S匹配的是任意的非空白字符(注意:刚好和\s相反);
  • \d匹配任意的数字;
  • \D匹配任意的非数字字符(注意:刚好和\d相反)。

例子如下所示
在这里插入图片描述
上面的四个例子从左到右依次表示:

  • ^.$表示匹配一行中的唯一一个任意的非换行符的字符
  • \ba\w\w\w\w\w\w\w\w\w\b表示匹配以字母a开始的后面有9个字母字符的单词。 (注意:其中的a并不是元字符,就是一个普通的字符,我们称之为字符串字面值(string literal)-所谓字符串字面值,就是字面上看起来是什么就是什么)
  • \b\w\w\w\d\d\d\d\D\b表示匹配以3个字母字符开始后面紧跟着四个数字字符且最后一个不是数字字符的单词。

正则表达式之文字匹配

字符类

(1)格式

  • .匹配任意单个字符,不能匹配空行
  • [] 匹配指定范围内的任意单个字符
  • [^] 取反
  • [:alnum:]或 [0-9a-zA-Z]
  • [:alpha:] 或 [a-zA-Z]
  • [:upper:]或 [A-Z]
  • [:lower:] 或 [a-z]
  • [:blank:] 空白字符(空格和制表符)
  • [:space:] 水平和垂直的空白字符(比[:blank:]包含的范围广)
  • [:cntrl:] 不可打印的控制字符(退格、删除、警铃…)
  • [:digit:] 十进制数字 或[0-9]
  • [:xdigit:]十六进制数字
  • [:graph:] 可打印的非空白字符
  • [:print:] 可打印字符
  • [:punct:] 标点符号

值得注意的是 -(连字符) 只有在字符类中的中间位置时才是“到”的意思。而[-b]5中-没有在两个字符之间,所以它表示的是-5或者b5。

除此之外,我们知道^时只匹配行的开头,但是如果^出现在字符类中的第一个位置,那么它表示否定该字符类。如[^123]表示匹配不是数字1或2或3的其他任意字符。[^-]表示匹配不是-的任意字符。

由此我们也可以发现:在字符类中使用元字符(-、^等)时,不需要进行转义运算。

更常用的有[^aeiou]匹配元音之外的字符、[0-9a-zA-Z_]匹配任何数字、字母(大写和小写)和下划线,这等同于\w、[^0-9a-zA-Z_]匹配任何非数字、字母(大写和小写)和下划线,这等同于\W。
在这里插入图片描述

字符转义

我们知道元字符如&、^、.等都表示着特殊的涵义,如果我们希望把他们看作一般的字符去匹配字符串,并且恰好他们又都不在字符类(如[&]中),我们就需要使用(反斜杠)进行转义了。

如我们可以使用www.jb51.net来匹配www.jb51.net。 我们可以用*来匹配字符串中的*(通配符)。 我们还可以通过\来匹配\。举例如下所示:
在这里插入图片描述

反义

实际上我们在前面已经说过了,这里再说一遍是因为希望可以引起注意,即^再字符类中的最前面时表示对这个字符类中的字符表示否定。如a[^b]匹配a和a后面不是b的字符。又如<asp[^>]>表示匹配<asp和其后面的字符不是>的字符。举例如下:
在这里插入图片描述

正则表达式之限定符

什么是限定符呢? 我们知道,在前面的例子中,我曾经使用过\ba\w\w\w\w\w\w\w\w\w\b表示匹配以字母a开始的后面有9个字母字符的单词,显然这样写是十分麻烦的,如果我们能把\w这些重复的用简单的形式来写就好了~ 没错,限定符就是干这个的,利用限定符我们可以重新写成\ba\w{9}\b。

  • {n} 表示重复n次,如\w{5}表示匹配个单词字符。
  • {n,} 表示重复至少n次,如\w{5}表示匹配至少5个单词字符,也可以是6个,7个……
  • {n,m} 表示重复至少n次,最多m次,如\w{5,10} 表示匹配至少5个,最多10个单词字符。
  • * 表示重复至少0次。 等同于{0,} ,即hu*t可以匹配ht或hut或huut或huuut……
  • + 表示重复至少1次。 等同于{1,},即hu+t可以匹配 hut或huut或huuut……
  • ? 表示重复0次或1次。等同于{0,1},即colou?r表示匹配color或者是colour。

显然,上面的限定符所指的i安定都是限定的前面的某一个字符。

但是,如果我们在上面的限定符之后加上一个?呢 ,这时我们称之为懒惰限定符。 相应地,我们称上面几种匹配为贪婪匹配。

  • {n}? 等同于{n}
  • {n,}? 尽可能少的使用重复,但至少使用n次
  • {n,m}? 重复n次到m次之间,但要尽可能少的使用重复。
  • *? 尽可能少的使用重复的第一个匹配
  • +? 尽可能少的使用重复,但至少使用1次
  • ?? 使用零次重复(如果有可能)或者一次重复

比如:对于aabab这个要 匹配的字符串而言,使用a.b会匹配aabab,而如果使用a.?b就会匹配aab和ab,而不是匹配所有。
在这里插入图片描述

正则表达式之字符的运算

替换

什么是替换呢? 显然就是指一个不行,我用另一个来替换,比如0\d{3}-\d{7}|0\d{2}-\d{8} 就表示匹配前4位为区号、后7位为本地号码的电话号码,亦可匹配前3位为区号、后8位为本地号码的电话号码。| 表示的就是替换了。 又如[Jj]ack和Jack|jack的匹配效果是一样的都是用来匹配Jack或jack的。也就是说,替换|是或运算的关系。

在一般的或运算中0 0结果为0, 0 1结果为1, 1 0结果为1, 1 1结果为1。那么在正则表达式中同样是这样,如果一个都匹配不上就不匹配;如果有一个能匹配上就匹配一个;如果两个都能匹配上,就匹配两个。 举例如下所示:
在这里插入图片描述

分组

正则表达式中,分组也是一个非常重要的概念。看似复杂,实际上分组就是使用"(“和”)",即左圆括号和右圆括号将某些字符括起来看成一个整体来处理。

比如我们希望匹配abcabc。如果是abc{3}匹配的就是abccc,这不能达到预期,所以我们可以对abc分组,即(abc){3}就可以匹配到我们想要的字符串了。

又如(\d{1,3}.){3}\d{1,3}也用了分组的运算方式,它可以用来匹配简单的IP地址,如下所示:
在这里插入图片描述

反向引用

上面我们通过()可以进行分组,而分组的同时,每一个组被自动赋予了一个组号,该组号可以代表该组的表达式。

编组的规则是:从左到右、以分组的左括号"("为标志,第一个分组的组号为1,第二个分组的组号为2,以此类推。

这时,反向引用就派上用场啦。我们就可以用它来反向引用使用()括起来的字符组了。具体怎么引用呢?规则如下:

  • \数字,使用数字命名的反向引用。注:这个是通用的一种方式。
  • \k<name>,使用指定命名的反向引用。注:这个是.NET Frameword支持的一种方式。
    下面的几个例子是使用数字命名的反向引用:
    在这里插入图片描述
    其中我们可以看到第一个和第二个匹配的并不相同—第一个匹配的是两个任意单词字符组成的单词,而第二个由于是使用了反向引用,那么它就必须是两个重复单词字符组成的单词。

最后一个我使用了两个分组,根据分组规则可知\w{3}\d{2}是第一个分组,\d{2}是第二个分组。 同样注意:反向引用的是同样的字符,如www55www5566,最后两位不同,这就无法正确匹配了。

使用指定命名(也就是自定义命名)的反向引用

对于上面的第二个例子,我们用自定义命名的反向引用可以写成\b(?<\myName>\w)\k<\myName>\b或者是\b(? ‘myName’ \w)\k<\myName>\b。 本想举例试一下,结果都提示错误,可能是上面提到的两个在线网站不支持吧~

当然,如果我们希望只是将之看作一个整体,而不希望给其编号,可以使用(?:expression)的方式。如下所示:
在这里插入图片描述
另外,下面几个也是常用的分组:

  • (?=expression)匹配字符串expression前面的位置
  • (?!expression)匹配后面不是字符串expression的位置
  • (?<=expression)匹配字符串expresssion后面的位置
  • (?<!expression)匹配前面不是字符串expression的位置
  • (?>expression)只匹配字符串expression一次

零宽度断言

之前介绍的^和$都是匹配的一个满足一定条件的位置。这里把满足的一个条件成为断言或零宽度断言。

常用的有:

  • ^ 匹配行的开始位置
  • $ 匹配行的结束位置
  • \A 匹配必须出现在字符串的开头
  • \Z 匹配必须出现在字符串的结尾或字符串结尾处的\换行符好n之前
  • \z 匹配必须出现在字符串的结尾
  • \G 匹配必须出现在上一个匹配结束的地方
  • \b 匹配字符的开始或结束位置
  • \B 匹配不是在字符的开始或结束位置

之前所提到的(?=expression)、(?!expression)、(?<=expression)、(?<!expression)也都是匹配一个位置。

其中(?=expression)称为零宽度预测先行断言,它断言自身位置的后面能够匹配表达式expression。如\b\w+(?=ed\b)可以匹配以字符串ed结尾的单词的前面部分,如reseted中的reset。

其中(?<=expression)又称为零宽度正回顾后发断言,它断言自身位置的前面能够匹配表达式expression。如(?<=\ban)\w+\b可以匹配除字符串an之外的部分。
在这里插入图片描述

负向零宽度断言

(?!expression)称为负向零宽度断言,即断言自身位置的后面不能匹配字符串expression。

如\b\w{3}(?!\d)匹配的是后面不是数字的以三个单词字符开头的三个单词字符。如下所示:

在这里插入图片描述

优先级顺序

正则表达式中存在元字符、转义符、限定符、|等运算或表达式。在匹配过程中,正则表达式都事先规定了这些运算或表达式的优先级。正则表达式也可以像数学表达式一样来求值。也就是说,正则表达式可以从左到右、并按照一个给定的优先级来求值。

优先级顺序表(优先级由高到低)如下:

  • 转义符:\
  • 圆括号和方括号:()、(?:)、(?=)、[]
  • 限定符: *、+、?、{n}、{n,}、{n,m}
  • 位置和顺序:^、$、(元字符)
  • 或运算:|
  • 我们可以看到或运算的优先级是最低的。

http://chatgpt.dhexx.cn/article/J870lGZW.shtml

相关文章

Python正则表达式大全

定义&#xff1a;正则表达式是对字符串&#xff08;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为“元字符”&#xff09;&#xff09;操作的一种逻辑公式&#xff0c;就是用事先定义好的一些特定字符、及这些特定字符的组…

JS正则表达式语法大全(非常详细)

前面几节讲解了如何在 JavaScript 中使用正则表达式&#xff0c;以及如何执行匹配&#xff0c;本节就来讲一下正则表达式的具体语法。 正则表达式是一种通用的工具&#xff0c;在 JavaScript、PHP、Java、Python、C 等几乎所有的编程语言中都能使用&#xff1b;但是&#xff0c…

正则表达式语法及例子

正则表达式的语法规则 一、行定位符&#xff08;^和$&#xff09; 行定位符就是用来描述字串的边界。“^”表示行的开始&#xff1b;“$”表示行的结尾。如&#xff1a; ^tm : 该表达式表示要匹配字串tm的开始位置是行头&#xff0c;如tm equal Tomorrow Moon就可以匹配 tm$ :…

最全的常用正则表达式大全

一、校验数字的表达式 1 数字&#xff1a;^[0-9]*$ 2 n位的数字&#xff1a;^\d{n}$ 3 至少n位的数字&#xff1a;^\d{n,}$ 4 m-n位的数字&#xff1a;^\d{m,n}$ 5 零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$ 6 非零开头的最多带两位小数的数字&#xff1a;^([1-9][…

正则表达式的语法

正则表达式语法简介  正则表达式是独立于任何语言的&#xff0c;虽然不同的 语言中其语法略有不同。  正则表达式的语法可以分为 • 特殊字符 • 边界匹配符 • 逻辑操作符 • 量词等  这些基本的语法规则合成使用&#xff0c;共同构成了正 则表达式强大的表示和匹配功能…

正则表达式基础语法大全

正则表达式基础语法 1.普通字符&#xff1a; 字母、数字、汉子、下划线、以及没有特殊定义的标点符号&#xff0c;都是“普通字符”。表达式中的普通字符&#xff0c;在匹配一个字符串的时候&#xff0c;匹配与之相同的一个字符。 2.简单的转义字符&#xff1a; 3.标准字符集…

最全常用正则表达式大全

一、校验数字的表达式 1. 数字&#xff1a;^[0-9]*$ 2. n位的数字&#xff1a;^\d{n}$ 3. 至少n位的数字&#xff1a;^\d{n,}$ 4. m-n位的数字&#xff1a;^\d{m,n}$ 5. 零和非零开头的数字&#xff1a;^(0|[1-9][0-9]*)$ 6. 非零开头的最多带两位小数的数字&#xff1a;^…

正则表达式的语法汇总

文章目录 1.正则表达式的基本语法1.1两个特殊符号 ^ 和 $^ 正则表达式的起始符$ 正则表达式的结束符^$ 结合使用不使用 ^$ 1.2 出现次数的表示符号 * &#xff1f;* 表示出现 0次 或者 至少1次 表示出现 至少1次? 表示出现 0次 或者 1次 1.3 指定出现次数的范围 {}使用{m,n} …

Java 集合List转 Map 和Map转List的方法总结(举例说明!)

最近遇到了一个场景是&#xff0c;要将从数据库中查出的List<bean>转换为List<map>然后再取map中的value&#xff0c;最后把所有的value写到Excel中。由于这个bean的属性太多了&#xff0c;我最开始没有采用list转map的方式取获取value&#xff0c;而是在for循环中…

Java8:list转Map

小故事 最近项目中&#xff0c;因为业务需要&#xff0c;我使用了for循环进行List转Map&#xff0c;项目经理看到了&#xff0c;深深的”鄙视“了我&#xff0c;说你怎么写这么古老的写法&#xff0c;一点不优雅。于是我就想到了Java8的新特性&#xff0c;使用stream流进行操作…

Java8 Stream(11)List转Map

一、前言 对于聚合统计可以参考下面博客。 Java8 Stream&#xff08;12&#xff09;Collectors 分组统计 详解 开发中&#xff0c;List转Map是非常常见的操作&#xff0c;例如&#xff1a; List<T> 转 Map<String, T>List<T> 转 Map<String, List<T&…

APP移动测试用例总结,总有你要用到的

目录 前言 一、首先是测试资源确认及准备 二、测试用例的设计与评审 三、UI测试 四、功能测试 五、中断测试 六、兼容性及适配测试 七、性能测试 八、稳定性测试 九、测试分析及测试报告输出 十、移动端测试用例的实践经验 总结 重点&#xff1a;配套学习资料和…

设计水杯,门锁的测试用例

测试用例公式&#xff1a; 功能测试 界面测试 性能测试 兼容性测试 易用性测试 安全测试 一般用脑图或者Excel来编写测试用例 百度脑图 - 便捷的思维工具 水杯的测试用例&#xff1a; 门锁的测试用例&#xff1a; 测试用例越多越好吗&…

APP 测试用例(大部分 APP 通用)

APP 测试用例 根据 场景设计法 来设计测试用例 安装与卸载权限设置软件更新登录与注册网络环境运行日历控件异常测试兼容性测试

在线音乐播放器测试用例

登录功能测试用例 当用户输入正确的用户名和密码时,方可登录成功,否则,会给出相应得提示。 上传音乐测试用例 用户选择上传的音乐后缀是.mp3时,才能上传成功。 查询音乐测试用例 查询音乐支持指定名称查询和模糊匹配查询。 安全测试 安全测试作为系统测试的主要部分&#xff0c…

APP移动测试用例总结

目录 前言 一、首先是测试资源确认及准备 二、测试用例的设计与评审 三、UI测试 四、功能测试 五、中断测试 六、兼容性及适配测试 七、性能测试 八、稳定性测试 九、测试分析及测试报告输出 十、移动端测试用例的实践经验 结语 前言 在我们的测试工作中&#xff0c;对于某…

手机app测试用例怎么写?手机app测试点有哪些?没有水分,错过绝对后悔

目录 一、前言 二、安装卸载测试点 安装测试 卸载测试 三、登录注册测试点 登录测试点 注册测试点 四、更新推送测试点 数据更新 消息推送 五、还有易用性&#xff0c;兼容性&#xff0c;安全性太多了&#xff01; 一、前言 在当今竞争激烈的市场上一个APP的成功离不…

淘宝APP购物车测试用例

淘宝APP购物车测试用例 淘宝购物车界面界面测试&#xff1a; 1、打开页面后&#xff0c;页面显示是否完整&#xff0c;页面布局是否合理。&#xff08;1&#xff09;标题、宝贝数显示、降价提示、管理。&#xff08;2&#xff09;字体大小、字体格式。 2、不同店家的商品在不…