轻松学习正则表达式

2025-05-28

轻松学习正则表达式

学习正则表达式


下载 PDF

什么是正则表达式?

正则表达式是一组字符或符号,用于从文本中查找特定模式。

正则表达式是一种从左到右匹配目标字符串的模式。“正则表达式”这个词比较
拗口,通常会被缩写为“regex”或“regexp”。正则表达式可用于替换字符串中的文本
、验证表单、根据模式匹配从字符串中提取子字符串等等。

假设您正在编写一个应用程序,并希望设置用户选择用户名的规则。我们希望
用户名可以包含字母、数字、下划线和连字符。我们还希望限制
用户名的字符数,使其看起来不难看。我们使用以下正则表达式来验证用户名:


正则表达式

上面的正则表达式可以接受字符串john_doejo-hn_doejohn12_as。但它不匹配,Jo因为该字符串
包含大写字母,而且太短。

目录

1. 基本匹配器

正则表达式只是我们用来在文本中执行搜索的字符模式。例如,正则表达式的
the意思是:字母t,后跟字母h,后跟字母e

"the" => 肥猫坐在垫子上。

测试正则表达式

正则表达式123与字符串 匹配123。正则表达式通过
将正则表达式中的每个字符与输入字符串中的每个字符逐一进行比较来与输入字符串进行匹配。正则表达式通常
区分大小写,因此正则表达式The不会与字符串 匹配the

"The" =>肥猫坐在垫子上。

测试正则表达式

2. 元字符

元字符是正则表达式的基石。元字符本身不代表任何含义,而是
以某种特殊的方式进行解释。有些元字符具有特殊含义,并被写在方括号内。
元字符如下:

元字符 描述
句点可匹配除换行符之外的任何单个字符。
[ ] 字符类。匹配方括号内的任意字符。
[^ ] 否定字符类。匹配方括号中不包含的任何字符
* 匹配前一个符号的 0 次或多次重复。
+ 匹配前一个符号的 1 个或多个重复。
使前面的符号成为可选的。
{n,m} 括号。匹配前一个符号至少“n”次、但不超过“m”次。
(XYZ) 字符组。按精确顺序匹配字符 xyz。
| 交替。匹配符号之前的字符或符号之后的字符。
\ 转义下一个字符。这允许你匹配保留字符 { } . * + ? ^ $ \ |
^ 匹配输入的开头。
$ 匹配输入的结尾。

2.1 句号

句号.是元字符最简单的例子。元字符.匹配任意单个字符。它不会匹配回车
符或换行符。例如,正则表达式的.ar意思是:任意字符,后跟字母a,后跟
字母r

".ar" =>汽车 车库里。

测试正则表达式

2.2 字符集

字符集也称为字符类。方括号用于指定字符集。在字符集内使用连字符来
指定字符的范围。方括号内的字符范围的顺序无关紧要。例如,正则
表达式[Tt]he的意思是:一个大写字母T或小写字母t,后跟字母h,再后跟字母e

“[Tt]he” =>汽车停在车库里。

测试正则表达式

然而,字符集内的句点表示文字句点。正则表达式的ar[.]意思是:一个小写字符a,后跟一个字母r,再后跟一个句点.字符。

"ar[.]" => 车库是停放车辆的好地方

测试正则表达式

2.2.1 否定字符集

通常,插入符号表示字符串的开头,但当它出现在左方括号后时,它会对
字符集进行取反。例如,正则表达式的[^c]ar意思是:除 之外的任何字符c,后跟字符a,再后跟
字母r

″[^c]ar″ => 汽车车库里。

测试正则表达式

2.3 重复

后面的元字符+*?用于指定子模式可以出现的次数。这些元字符
在不同情况下的作用不同。

2.3.1 星星

该符号*匹配前一个匹配符的零次或多次重复。正则表达式的a*意思是:
前一个小写字母 的零次或多次重复a。但如果它出现在字符集或字符类之后,则会查找整个字符集的重复
。例如,正则表达式的[a-z]*意思是:连续出现任意数量的小写字母。

”[az]* ” =>汽车 21 号
车库    

测试正则表达式

*符号可以与元字符一起使用,.以匹配任意字符串.*。该符号可以与 空格字符*一起使用,以匹配一串空格字符。例如,该表达式的意思是:零个或多个 空格,后跟小写字符,后跟小写字符,后跟小写字符,后跟 零个或多个空格。
\s\s*cat\s*
cat

"\s*cat\s*" = >肥猫坐在连接线上

测试正则表达式

2.3.2 加号

该符号+匹配前一个字符的一个或多个重复。例如,正则表达式的c.+t意思是:小写
字母c,后跟至少一个字符,再后跟小写字符t。需要澄清的是,是句子中的t最后一个字符。t

"c.+t" => 肥猫坐在垫子上

测试正则表达式

2.3.3 问号

在正则表达式中,元字符?使前一个字符成为可选字符。此符号匹配
前一个字符的零个或一个实例。例如,正则表达式的[T]?he意思是:可选的大写字母T,后跟小写
字符h,后跟小写字符e

“[T]he” =>汽车停在车库里。

测试正则表达式

“[T]?he” =>汽车停在车库里。

测试正则表达式

2.4 大括号

在正则表达式中,括号(也称为量词)用于指定一个字符或一组字符可以重复的次数
。例如,正则表达式的[0-9]{2,3}意思是:匹配至少 2 位数字,但不超过 3 位数字(
0 到 9 范围内的字符)。

“[0-9]{2,3}” => 这个数字是 9.999 7,但我们将其四舍五入为10.0

测试正则表达式

我们可以省略第二个数字。例如,正则表达式[0-9]{2,}的意思是:匹配 2 位或更多数字。如果我们也删除
逗号,则正则表达式的[0-9]{3}意思是:匹配恰好 3 位数字。

“[0-9]{2,}” => 这个数字是 9.9997,我们将其四舍五入为10.0

测试正则表达式

“[0-9]{3}” => 这个数字是 9.999 7,但我们将其四舍五入为 10.0。

测试正则表达式

2.5 字符组

字符组是写在括号内的一组子模式(...)。正如我们之前讨论过的,在正则表达式中
,如果我们在字符后放置量词,那么它将重复前面的字符。但是,如果我们在字符组后放置量词,那么
它将重复整个字符组。例如,正则表达式(ab)*匹配字符“ab”的零次或多次重复。
我们还可以在字符组内使用交替|元字符。例如,正则表达式的(c|g|p)ar意思是:小写字符c
gp,后跟字符a,后跟字符r

"(c|g|p)ar" =>汽车车库

测试正则表达式

2.6 交替

在正则表达式中,竖线|用于定义交替。交替就像多个表达式之间的条件。现在,
您可能会认为字符集和交替的工作方式相同。但是字符集和交替之间的最大区别
在于,字符集在字符级别起作用,而交替在表达式级别起作用。例如,正则表达式的
(T|t)he|car意思是:大写字符T或小写字符t,后跟小写字符h,后跟小写字符e
或小写字符c,后跟小写字符a,后跟小写字符r

"(T|t)he|car" =>汽车 车库里。

测试正则表达式

2.7 转义特殊字符

正则表达式中使用反斜杠\来转义下一个字符。这允许将符号指定为匹配字符,
包括保留字符{ } [ ] / \ + * . $ ^ | ?。要使用特殊字符作为匹配字符,请将其添加\到其前面。
例如,正则表达式.用于匹配除换行符之外的任何字符。现在,要.在输入字符串中进行匹配,正则
表达式的(f|c|m)at\.?意思是:小写字母fcm,后跟小写字符a,后跟小写字母
t,后跟可选.字符。

"(f|c|m)at\.?" =>肥猫坐在 垫子上

测试正则表达式

2.8 锚点

在正则表达式中,我们使用锚点来检查匹配符号是输入字符串的起始符号还是结束符号
。锚点有两种类型:第一种是插入符号,^用于检查匹配字符是否是
输入字符串的起始字符;第二种是美元符号$,用于检查匹配字符是否是输入字符串的最后一个字符

2.8.1 插入符号

插入^符号用于检查匹配字符是否是输入字符串的第一个字符。如果我们将以下正则
表达式^a(假设 a 是起始符号)应用于输入字符串,abc则匹配a。但是,如果我们将正则表达式应用于^b上述
输入字符串,则它不匹配任何内容。因为在输入字符串中,abc“b”不是起始符号。让我们看另一个
正则表达式^(T|t)he,其含义是:大写字符T或小写字符t是输入字符串的起始符号,
后跟小写字符h,再后跟小写字符e

"(T|t)he" =>汽车停在车库里。

测试正则表达式

"^(T|t)he" =>汽车停在车库里。

测试正则表达式

2.8.2 美元

美元$符号用于检查匹配字符是否是输入字符串的最后一个字符。例如,正则表达式的
(at\.)$意思是:一个小写字符a,后跟一个小写字符t,再后跟一个.字符,并且匹配器
必须位于字符串的末尾。

"(at\.)" => 粗体 c at. s at.在 m at 上。

测试正则表达式

"(at\.)$" => 那只肥猫坐在 m 上

测试正则表达式

3.简写字符集

正则表达式提供了常用字符集的简写,为常用的
正则表达式提供了便捷的简写方式,简写字符集如下:

速记 描述
除换行符之外的任意字符
\w 匹配字母数字字符:[a-zA-Z0-9_]
\W 匹配非字母数字字符:[^\w]
\d 匹配数字:[0-9]
\D 匹配非数字:[^\d]
\s 匹配空白字符:[\t\n\f\r\p{Z}]
\S 匹配非空白字符:[^\s]

4. 环顾四周

后视和前视(有时也称为环视)是特定类型的非捕获组(用于匹配模式但不
包含在匹配列表中)。当条件是此模式之前或之后是另一个特定模式时,使用前视。例如,我们想从以下输入字符串中
获取所有以字符开头的数字 我们将使用以下正则表达式,其含义是:获取所有包含字符且 以字符开头的数字。以下是正则表达式中使用的环视:$$4.44 and $10.88
(?<=\$)[0-9\.]*.
$

象征 描述
?= 积极展望
?! 负向前瞻
?<= 正向回顾
?<! 负向后视

4.1 正向前瞻

正向前瞻断言表达式的第一部分必须跟在前瞻表达式后面。返回的匹配
仅包含表达式第一部分匹配的文本。要定义正向前瞻,需要使用括号。在
括号内,使用带等号的问号,如下所示:(?=...)。前瞻表达式写在括号内的等号后面
。例如,正则表达式的[T|t]he(?=\sfat)意思是:选择性地匹配小写字母t或大写字母T
后跟字母h,后跟字母e。在括号中,我们定义正向前瞻,它告诉正则表达式引擎匹配
The或,the后跟单词fat

quot;[T|t]he(?=\sfat)quot; =>肥猫坐在垫子上。

测试正则表达式

4.2 负向前瞻

当我们需要从输入字符串中获取所有不跟某个模式的匹配项时,会使用负向前瞻。负向前瞻
的定义与正向前瞻相同,但唯一的区别在于=我们使用否定字符(即 ) 而不是等号!字符。让我们看一下以下正则表达式,其含义是:从输入字符串中获取所有后面 不跟空格字符的单词。
(?!...)[T|t]he(?!\sfat)Thethe
fat

“[T|t]he(?!\sfat)” => 肥猫坐在垫子上。

测试正则表达式

4.3 正向后视

正向后行断言用于获取所有以特定模式开头的匹配项。正向后行断言用 表示
(?<=...)。例如,正则表达式的意思是:从输入字符串中(?<=[T|t]he\s)(fat|mat)获取 位于单词或之后的所有fat或个单词mat
Thethe

"(?<=[T|t]he\s)(fat|mat)" => 肥猫坐在垫子

测试正则表达式

4.4 负向后行

负向后行用于获取所有不以特定模式开头的匹配项。负向后行用 表示
(?<!...)。例如,正则表达式的意思是:从输入字符串中(?<!(T|t)he\s)(cat)获取所有 不在单词或之后的单词cat
Thethe

"(?<![T|t]he\s)(cat)" => 猫坐在cat上。

测试正则表达式

5.旗帜

标志也称为修饰符,因为它们会修改正则表达式的输出。这些标志可以按任意顺序或
组合使用,并且是正则表达式不可或缺的一部分。

旗帜 描述
不区分大小写:将匹配设置为不区分大小写。
全局搜索:在整个输入字符串中搜索模式。
多行:锚元字符在每一行上起作用。

5.1 不区分大小写

修饰符i用于执行不区分大小写的匹配。例如,正则表达式的/The/gi意思是:大写字母
T,后跟小写字符h,再后跟字符e。正则表达式末尾的i标志位告诉
正则表达式引擎忽略大小写。如您所见,我们还提供了标志位,因为我们想要在 整个输入字符串g中搜索模式。

"The" =>肥猫坐在垫子上。

测试正则表达式

"/The/gi" =>肥猫坐在垫子上。

测试正则表达式

5.2 全局搜索

修饰符g用于执行全局匹配(查找所有匹配项,而不是在第一个匹配项后停止)。例如,
正则表达式的/.(at)/g意思是:除换行符之外的任意字符,后跟小写字符a,再后跟小写
字符。因为我们在正则表达式的末尾t提供了标志,所以它现在会从整个输入 字符串中查找所有匹配项。g

"/.(at)/" =>肥猫坐在垫子上。

测试正则表达式

"/.(at)/g" = >肥猫 坐在垫子 

测试正则表达式

5.3 多行

修饰符m用于执行多行匹配。正如我们之前讨论过的,锚点(^, $)用于检查模式是
输入字符串的开头还是结尾。但如果我们希望锚点在每一行都起作用,我们会使用m标志位。例如,
正则表达式的/at(.)?$/gm意思是:小写字母a,后跟小写字母t,以及除换行符之外的任何字符(可选)
。由于有了m标志位,现在正则表达式引擎会在字符串的每一行末尾匹配模式。

"/.at(.)?$/" => 脂肪
                猫坐
                在垫子上

测试正则表达式


                  " /.at(.)?$/gm " =>肥猫坐在垫子
                  上

测试正则表达式

文章来源:https://dev.to/zeeshanahmad/learn-regex-the-easy-way-c4g
PREV
单个 JSON 文件如何成为您的整个代码库
NEXT
10 个实用的 JavaScript 技巧