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

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(Regular Expression)的开发手册(正则符号深入解析 )

借鉴官网的速查表

基础匹配符号

反向匹配表

各种操作符的运算优先级

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

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

高优先级:

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

中优先级:

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

低优先级:

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

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

案例分析

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

  1. /\b([a-z]+) \1\b/gi: 该正则表达式用于匹配连续出现的单词位置。具体解释如下:
  • \b: 匹配单词的边界。
  • ([a-z]+): 匹配一个或多个小写字母,并将其捕获为第一个分组。
  • \1: 引用第一个分组,即重复之前匹配的单词。
  • \b: 匹配单词的边界。
  • gi: 标志,表示全局匹配(匹配所有的连续出现的单词)和不区分大小写。
  1. /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/: 该正则表达式用于将一个URL解析为协议、域名、端口和相对路径。具体解释如下:
  • (\w+): 匹配一个或多个单词字符,并将其捕获为第一个分组,表示协议。
  • :\/\/: 匹配 "://" 字符。
  • ([^/:]+): 匹配除了 ":" 和 "/" 之外的任意字符,并将其捕获为第二个分组,表示域名。
  • (:\d*)?: 匹配可选的冒号和数字,并将其捕获为第三个分组,表示端口。
  • ([^# ]*): 匹配除了 "#" 和空格之外的任意字符,并将其捕获为第四个分组,表示相对路径。
  1. /^(?:Chapter|Section) [1-9][0-9]{0,1}$/: 该正则表达式用于定位章节的位置。具体解释如下:
  • ^: 匹配字符串的开始位置。
  • (?:Chapter|Section): 非捕获类型的分组,匹配 "Chapter" 或 "Section"。
  • :匹配一个空格。
  • [1-9][0-9]{0,1}:匹配一个以1-9开头的数字,后面跟0-9之间的一个数字(可选)。
  • $: 匹配字符串的结束位置。
  1. /[-a-z]/: 该正则表达式用于匹配26个小写字母及连字符 "-"。它表示任何一个小写字母或连字符。
  2. /ter\b/: 该正则表达式可匹配 "chapter" 字符串中的 "ter",但不匹配 "terminal",因为 \b 表示单词边界。
  3. /\Bapt/: 该正则表达式可匹配 "chapter" 字符串中的 "apt",但不匹配 "aptitude",因为 \B 表示非单词边界。
  4. /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"可以匹配如下字符串段落:

css

复制代码

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 次。

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

less

复制代码

^[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} 任意两个字符
表达式的等价对比

less

复制代码

^[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,}$


相关文章
|
1天前
|
机器学习/深度学习 人工智能 自然语言处理
AI技术深度解析:从基础到应用的全面介绍
人工智能(AI)技术的迅猛发展,正在深刻改变着我们的生活和工作方式。从自然语言处理(NLP)到机器学习,从神经网络到大型语言模型(LLM),AI技术的每一次进步都带来了前所未有的机遇和挑战。本文将从背景、历史、业务场景、Python代码示例、流程图以及如何上手等多个方面,对AI技术中的关键组件进行深度解析,为读者呈现一个全面而深入的AI技术世界。
36 10
|
9天前
|
机器学习/深度学习 人工智能 自然语言处理
秒级响应 + 99.9%准确率:法律行业文本比对技术解析
本工具基于先进AI技术,采用自然语言处理和语义匹配算法,支持PDF、Word等格式,实现法律文本的智能化比对。具备高精度语义匹配、多格式兼容、高性能架构及智能化标注与可视化等特点,有效解决文本复杂性和法规更新难题,提升法律行业工作效率。
|
6天前
|
数据采集 存储 JavaScript
网页爬虫技术全解析:从基础到实战
在信息爆炸的时代,网页爬虫作为数据采集的重要工具,已成为数据科学家、研究人员和开发者不可或缺的技术。本文全面解析网页爬虫的基础概念、工作原理、技术栈与工具,以及实战案例,探讨其合法性与道德问题,分享爬虫设计与实现的详细步骤,介绍优化与维护的方法,应对反爬虫机制、动态内容加载等挑战,旨在帮助读者深入理解并合理运用网页爬虫技术。
|
12天前
|
机器学习/深度学习 自然语言处理 监控
智能客服系统集成技术解析和价值点梳理
在 2024 年的智能客服系统领域,合力亿捷等服务商凭借其卓越的技术实力引领潮流,它们均积极应用最新的大模型技术,推动智能客服的进步。
47 7
|
17天前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
44 3
|
20天前
|
网络协议 网络性能优化 数据处理
深入解析:TCP与UDP的核心技术差异
在网络通信的世界里,TCP(传输控制协议)和UDP(用户数据报协议)是两种核心的传输层协议,它们在确保数据传输的可靠性、效率和实时性方面扮演着不同的角色。本文将深入探讨这两种协议的技术差异,并探讨它们在不同应用场景下的适用性。
54 4
|
20天前
|
Kubernetes Java 微服务
微服务上下线动态感知实现的技术解析
随着微服务架构的广泛应用,服务的动态管理和监控变得尤为重要。在微服务架构中,服务的上下线是一个常见的操作,如何实时感知这些变化,确保系统的稳定性和可靠性,成为了一个关键技术挑战。本文将深入探讨微服务上下线动态感知的实现方式,从技术基础、场景案例、解决思路和底层原理等多个维度进行阐述,并分别使用Java和Python进行演示介绍。
43 4
|
20天前
|
安全 持续交付 Docker
深入理解并实践容器化技术——Docker 深度解析
深入理解并实践容器化技术——Docker 深度解析
41 2
|
20天前
|
供应链 算法 安全
深度解析区块链技术的分布式共识机制
深度解析区块链技术的分布式共识机制
41 0
|
20天前
|
存储 供应链 算法
深入解析区块链技术的核心原理与应用前景
深入解析区块链技术的核心原理与应用前景
44 0

推荐镜像

更多