【夯实技术基本功】「底层技术原理体系」全方位带你认识和透彻领悟正则表达式(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"可以匹配如下字符串段落:

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个例子可以简化为:

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

ruby 复制代码
^\-?[0-9]{0,}\.?[0-9]{0,}$
相关推荐
世间万物皆对象16 分钟前
Spring Boot核心概念:日志管理
java·spring boot·单元测试
没书读了1 小时前
ssm框架-spring-spring声明式事务
java·数据库·spring
小二·1 小时前
java基础面试题笔记(基础篇)
java·笔记·python
开心工作室_kaic1 小时前
ssm161基于web的资源共享平台的共享与开发+jsp(论文+源码)_kaic
java·开发语言·前端
懒洋洋大魔王1 小时前
RocketMQ的使⽤
java·rocketmq·java-rocketmq
武子康1 小时前
Java-06 深入浅出 MyBatis - 一对一模型 SqlMapConfig 与 Mapper 详细讲解测试
java·开发语言·数据仓库·sql·mybatis·springboot·springcloud
qq_17448285752 小时前
springboot基于微信小程序的旧衣回收系统的设计与实现
spring boot·后端·微信小程序
转世成为计算机大神2 小时前
易考八股文之Java中的设计模式?
java·开发语言·设计模式
qq_327342732 小时前
Java实现离线身份证号码OCR识别
java·开发语言
锅包肉的九珍2 小时前
Scala的Array数组
开发语言·后端·scala