【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )

@[TOC](【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 ))

借鉴官网的速查表

基础匹配符号

在这里插入图片描述

反向匹配表

在这里插入图片描述

各种操作符的运算优先级

承接上文,在正则表达式中,相同优先级的操作符按照从左到右的顺序进行运算,而不同优先级的操作符则按照先高后低的顺序进行运算。以下是各种操作符的优先级从高到低的顺序:

操作符描述
\转义符
( ), (?:), (?=), []圆括号和方括号
*, +, ?, {n}, {n,}, {n,m}限定符
^, $, \anymetacharacter位置和顺序
|"或"操作

高优先级:

圆括号:(),用于明确指定运算的顺序。

中优先级:

量词操作符:*、+、?、{n}、{n,}、{n,m},用于匹配指定次数的字符或子表达式。

低优先级:

  • 字符类操作符:[ ],用于定义字符集合。
  • 转义符:\,用于转义特殊字符。

请注意,具体的正则表达式操作符优先级可能根据不同的正则引擎或编程语言而有所不同。了解操作符的优先级可以帮助我们编写更准确和可读性更高的正则表达式,并确保表达式按照预期的方式进行匹配。

案例分析

下面是对每个正则表达式进行分析和解释的说明:

  1. /\b([a-z]+) \1\b/gi: 该正则表达式用于匹配连续出现的单词位置。具体解释如下:

    • \b: 匹配单词的边界。
    • ([a-z]+): 匹配一个或多个小写字母,并将其捕获为第一个分组。
    • \1: 引用第一个分组,即重复之前匹配的单词。
    • \b: 匹配单词的边界。
    • gi: 标志,表示全局匹配(匹配所有的连续出现的单词)和不区分大小写。
  2. /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/: 该正则表达式用于将一个URL解析为协议、域名、端口和相对路径。具体解释如下:

    • (\w+): 匹配一个或多个单词字符,并将其捕获为第一个分组,表示协议。
    • :\/\/: 匹配 "://" 字符。
    • ([^/:]+): 匹配除了 “:” 和 “/” 之外的任意字符,并将其捕获为第二个分组,表示域名。
    • (:\d*)?: 匹配可选的冒号和数字,并将其捕获为第三个分组,表示端口。
    • ([^# ]*): 匹配除了 “#” 和空格之外的任意字符,并将其捕获为第四个分组,表示相对路径。
  3. /^(?:Chapter|Section) [1-9][0-9]{0,1}$/: 该正则表达式用于定位章节的位置。具体解释如下:

    • ^: 匹配字符串的开始位置。
    • (?:Chapter|Section): 非捕获类型的分组,匹配 “Chapter” 或 “Section”。
    • :匹配一个空格。
    • [1-9][0-9]{0,1}:匹配一个以1-9开头的数字,后面跟0-9之间的一个数字(可选)。
    • $: 匹配字符串的结束位置。
  4. /[-a-z]/: 该正则表达式用于匹配26个小写字母及连字符 “-”。它表示任何一个小写字母或连字符。

  5. /ter\b/: 该正则表达式可匹配 “chapter” 字符串中的 “ter”,但不匹配 “terminal”,因为 \b 表示单词边界。

  6. /\Bapt/: 该正则表达式可匹配 “chapter” 字符串中的 “apt”,但不匹配 “aptitude”,因为 \B 表示非单词边界。

  7. /Windows(?=95 |98 |NT )/: 该正则表达式可匹配 “Windows95”、“Windows98” 或 “WindowsNT”,当找到匹配后,从"Windows"后面开始进行下一次的检索匹配。其中的 (?=95 |98 |NT ) 是一个正向预查,用于匹配 "95 "、"98 "、"NT ",但不包括这些字符在匹配结果中。

正则表达式匹配规则

基本模式匹配

在正则表达式中,模式是它们的基本元素,用来描述字符串的特征。模式可以非常简单,由普通的字符串组成,也可以非常复杂,包含特殊的字符来表示字符范围、重复出现或上下文。例如:

  • ^once: 这个模式中的特殊字符^表示该模式只匹配以"once"开头的字符串。例如,该模式可以匹配字符串"once upon a time",但无法匹配"There once was a man from NewYork"。与^表示开头类似,$符号用来匹配以给定模式结尾的字符串。

  • bucket$: 这个模式可以匹配"Who kept all of this cash in a bucket",但无法匹配"buckets"。当^$字符同时使用时,表示精确匹配,即字符串与模式完全匹配。例如,^bucket$只能匹配字符串"bucket"。如果一个模式不包含^$,则它可以匹配包含该模式的任何字符串。例如,模式"once"可以匹配如下字符串段落:

There once was a man from NewYork
Who kept all of his cash in a bucket.
  • 在模式中,字母(如o、n、c、e)及数字都被视为字面字符,即它们表示它们自己。对于其他一些稍微复杂的字符,如标点符号和空白字符(如空格、制表符等),需要使用转义序列。所有的转义序列都以反斜杠(\)开头。例如,制表符的转义序列是\t,所以如果我们想匹配以制表符开头的字符串,可以使用模式^\t

类似地,\n表示换行符,\r表示回车符。其他特殊符号可以通过在前面加上反斜杠进行转义,例如,反斜杠本身用\\表示,句点.\.表示,以此类推。

字符组

在现代互联网应用程序中,正则表达式常被用于验证用户的输入。当用户提交表单时,需要验证输入的电话号码、地址、电子邮件地址、信用卡号等是否有效。使用基于字面的字符匹配是不够的,因此需要一种更灵活的描述所需模式的方法,这就是字符组。

字符组是用于匹配一组指定字符的正则表达式元素。通过使用连字符(减号)来表示字符范围,字符组可以用于匹配特定范围内的字符。例如,对于需要表示所有元音字符的情况,可以将所有元音字符放在方括号内以构建一个字符组。

  • [AaEeIiOoUu] :这个字符组可以用于匹配任何一个元音字符。

通过将所需的字符放入字符组中,可以更灵活地匹配特定的字符模式。字符组允许指定多个字符作为候选项,并且只要输入的字符与字符组中的任意一个字符匹配即可。

  • [a-z]:这个字符组可以用于匹配所有的小写字母。
  • [A-Z]:这个字符组可以用于匹配所有的大写字母。
  • [a-zA-Z]:这个字符组可以用于匹配所有的字母。
  • [0-9]:这个字符组可以用于匹配所有的数字。
  • [0-9\.\-]:这个字符组可以用于匹配所有的数字、句号和减号。
  • [ \f\r\t\n]:这个字符组可以用于匹配所有的空白字符,包括空格、换页符、回车符、制表符和换行符。

通过将所需的字符放入字符组中,可以更灵活地匹配特定的字符范围。连字符用于表示字符的连续范围。字符组是一种强大的工具,可以使正则表达式更精确地匹配特定的字符模式。

字符组案例分析

字符组同样只能匹配单个字符,这一点至关重要。如果想要匹配由一个小写字母和一位数字组成的字符串,例如:“z2”、“t6"或"g7”,但不匹配"ab2"、“r2d3"或"b52”,可以使用以下模式:

^[a-z][0-9]$

尽管[a-z]表示26个字母的范围,但在这个模式中,它只能与第一个字符是小写字母的字符串进行匹配。

这个模式使用^匹配字符串的开头,接着是一个小写字母范围的字符,然后是一个数字范围的字符,最后使用$匹配字符串的结尾。这样,模式能够确保只匹配满足特定要求(一个小写字母后跟一个数字)的单个字符字符串。

字符组的控制分析

前面提到的 ^ 表示字符串的开头,但它还有另外一个含义。当在方括号内使用 ^,它表示“非”或“排除”的意思,常常用来排除某个字符。继续使用之前的例子,我们要求第一个字符不能是数字:

^[^0-9][0-9]$

在这个模式中,^[^0-9] 表示匹配的第一个字符不能是数字,[0-9]$ 表示第二个字符必须是数字,例如与"&5"、“g7"及”-2"是匹配的,但与"12"、"66"是不匹配的。

通过在方括号内使用 ^,我们可以构建一个字符组,明确指定要排除的字符范围,[^0-9] 表示除数字之外的任意字符。使用 ^ 匹配字符串的开头,接着是一个不能为数字的字符,然后是一个数字。由于使用了 ^$,模式需满足整个字符串的匹配。

几个排除特定字符的例子

下面是对描述的优化和润色的版本:

  • [^a-z]:除了小写字母之外的所有字符。
  • [^\\\/\^]:除了反斜杠(\)、正斜杠(/)和插入符号(^)之外的所有字符。
  • [^\"\']:除了双引号(")和单引号(')之外的所有字符。

在正则表达式中,特殊字符".“(点,句号)用来表示除了换行符(“新行”)之外的所有字符。因此,模式”^.5$“可以匹配任何由两个字符组成、以数字5结尾且以非换行符开头的字符串。模式”."可以匹配任何非空串,但不包括只有一个换行符组成的字符串。

重复出现次数

在之前的内容中,你已经了解到如何匹配单个字母或数字,但通常情况下,我们可能需要匹配单词或数字组。一个单词由多个字母组成,一组数字由多个单数字组成。花括号({})紧跟在字符或字符组后面,用于确定前面内容的重复出现次数。

花括号的分析介绍
  • {x} 表示前面的字符或字符组恰好出现 x 次。
  • {x,} 表示前面的内容出现 x 或更多的次数。
  • {x,y} 表示前面的内容至少出现 x 次,但不超过 y 次。

这种形式的花括号可以帮助我们更精确地控制重复内容的匹配次数,并满足特定的需求。

^[a-zA-Z0-9_]{1,}$ //所有包含一个或多个字母、数字或下划线的字符串
^[0-9]{1,}$ //所有的正数
^\-{0,1}[0-9]{1,}$ //所有的整数
^\-{0,1}[0-9]{0,}\.{0,1}[0-9]{0,}$ //所有的小数
简单的解释
  • 第一个模式表示匹配包含一个或多个字母、数字或下划线的字符串。
  • 第二个模式表示匹配所有正数。
  • 第三个模式表示匹配所有整数,可带一个可选的负号前缀。
  • 最后一个模式表示匹配所有小数,可以有一个可选的负号前缀和小数点,小数点前后可以是任意数量的数字。
花括号的用法案例大全
字符组含义
^[a-zA-Z_]$所有字母和下划线
^a$字母 “a”
^a{4}$“aaaa”
^a{2,4}$“aa”、“aaa"或"aaaa”
^a{1,3}$“a”、“aa"或"aaa”
^a{2,}$包含两个以上 “a” 的字符串
^a{2,}“aardvark"和"aaab”,但不包括"apple"
a{2,}“baad"和"aaa”,但不包括 “Nantucket”
\t{2}两个制表符
.{2}任意两个字符
表达式的等价对比
^[a-zA-Z0-9_]+$ //所有包含一个或多个字母、数字或下划线的字符串
^[0-9]+$ //所有正数
^\-?[0-9]+$ //所有整数
^\-?[0-9]*\.?[0-9]*$ //所有小数
表达式简化处理
  • 特殊字符 “?” 与 {0,1} 是等价的,它们都表示 “0个或1个前面的内容” 或 “前面的内容是可选的”。
  • 特殊字符 “*” 与 {0,} 是等价的,它们表示 “0个或多个前面的内容”。
  • 特殊字符 “+” 与 {1,} 是等价的,表示 “1个或多个前面的内容”。因此,前面的4个例子可以简化为:

因此,之前的例子可以简化为:

^\-?[0-9]{0,}\.?[0-9]{0,}$

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

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

相关文章

Efficient physics-informed neural networks using hash encoding

论文阅读:Efficient physics-informed neural networks using hash encoding Efficient physics-informed neural networks using hash encoding简介方法PINN哈希编码具有哈希编码的 PINN 实验Burgers 方程Helmholtz 方程N-S 方程训练效率对比 总结 Efficient physi…

try catch 应该在 for 循环里面还是外面?(荣耀典藏版)

大家好,我是月夜枫,今天突然想到一个很有意思的问题, try catch 应该在 for 循环里面还是外面那?欢迎大家积极留言讨论。 一、使用场景 为什么要把 使用场景 摆在第一个 ? 因为本身try catch 放在 for循环 外面 和里面…

谷歌Gemini刚发就惹质疑:测试标准有失偏颇,效果视频疑似剪辑

梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 谷歌憋了许久的大招,双子座Gemini大模型终于发布!其中一图一视频最引人注目: 一图,MMLU多任务语言理解数据集测试,Gemini Ultra不光超越GPT-4,甚至超越了…

「Python编程基础」第6章:字典

文章目录 一、字典数据类型二、细说字典与列表三、重要的3个方法:keys()、values()、items()四、检查字典中是否存在键或值五、get()方法六、清空七、修改八、字典的嵌套字典套字典字典套列表字典套字典套列表 练习题 一、字典数据类型 编程的 「字典」 其实和现实中…

预训练--微调

预训练–微调 一个很简单的道理,如果我们的模型是再ImageNet下训练的,那么这个模型一定是会比较复杂的,意思就是这个模型可以识别到很多种类别的即泛化能力很强,但是如果要它精确的识别是否某种类别,它的表现可能就不…

frp内网穿透部署,轻松实现内网服务对外访问

FRP(Fast Reverse Proxy)是一种轻量级、高性能的反向代理工具,利用反向代理技术将公网请求转发至内网服务器上,并将内网服务器的响应再次转发至公网请求者。在实现内网穿透时,FRP能够将公网与内网之间的隔离突破&#…

ArkTS快速入门

一、概述 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者可以…

jmeter常用的性能测试监听器

jmeter中提供了很多性能数据的监听器,我们通过监听器可以来分析性能瓶颈 本文以500线程的阶梯加压测试结果来描述图表。 常用监听器 1:Transactions per Second 监听动态TPS,用来分析吞吐量。其中横坐标是运行时间,纵坐标是TPS…

火狐,要完了!

在过去几年中,关于Firefox 浏览器的衰落有过不少讨论。目前来说,很多公共的以及私营的大型网站都缺乏对Firefox的适当支持。但是Firefox也多次试图“自救”,甚至就在不久前,Mozilla 通过官博发文,表示 Firefox 在 2023…

一个 postman实现参数化让我丢掉了一份20k的offer

什么时候会用到参数化 比如:一个模块要用多组不同数据进行测试 验证业务的正确性 Login模块:正确的用户名,密码 成功;错误的用户名,正确的密码 失败 postman实现参数化 在实际的接口测试中,部分参数…

设计并实现一个多线程图书馆管理系统,涉及数据库操作

没有实现全部功能,希望路过的大佬,可以实现全部功能,在评论区聊聊 创建数据库library-demo CREATE DATABASE library-demo创建图书表book CREATE TABLE book (bookId int(11) NOT NULL AUTO_INCREMENT COMMENT 图书ID,bookName varchar(15)…

Leetcode—213.打家劫舍II【中等】

2023每日刷题&#xff08;五十二&#xff09; Leetcode—213.打家劫舍II 算法思路 实现代码 class Solution { public:// 左闭右开int rob1(vector<int>& nums, int start, int end) {int n nums.size();int f0 0, f1 0, new_f 0;for(int i start; i < end…