目录
[五.正则表达式 - 修饰符](#五.正则表达式 - 修饰符)
[七.正则表达式 - 运算符优先级](#七.正则表达式 - 运算符优先级)
[1. 字面匹配](#1. 字面匹配)
[2. 特殊字符](#2. 特殊字符)
[3. 元字符](#3. 元字符)
[4. 边界匹配](#4. 边界匹配)
[5. 贪婪与非贪婪](#5. 贪婪与非贪婪)
[6. 修饰符](#6. 修饰符)
[7. 零宽度匹配](#7. 零宽度匹配)
一.什么是正则
正则表达式(Regular Expression,简称regex或regexp)是一种用来描述字符串搜索和匹配模式的工具。它被广泛应用于文本处理、数据解析、字符串匹配等领域,允许用户使用简单或复杂的规则来搜索和操作文本数据。正则表达式被许多编程语言和工具支持,例如Python、JavaScript、Perl、Java、Rust、Go等。在这些语言中,你可以使用正则表达式来完成各种字符串操作任务。
二.正则表达式的用途
正则表达式的常见用途包括:
- 搜索和查找:在文本中查找特定的模式。例如,在一段文本中查找所有包含日期的行。
- 验证和匹配:验证文本是否符合特定的规则。例如,验证一个字符串是否是有效的电子邮件地址。
- 替换和修改:根据匹配的模式替换文本中的内容。例如,将某个特定模式的字符串替换成另一个字符串。
三.发展历史
正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。
1951 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。
随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 grep 编辑器。
大致发展历史如下:
-
1951年:计算理论的奠基人之一,美国计算机科学家Stephen Kleene首次提出了正则语言的概念,并使用形式化的方法来描述这种语言。这为正则表达式的发展奠定了理论基础。
-
1960年代:Ken Thompson,Unix操作系统的共同创始人之一,开发了第一个实际应用正则表达式的程序,它是Unix中grep命令的一部分。这标志着正则表达式的实际应用。
-
1970年代:Ken Thompson和Rob Pike开发了第一个正则表达式引擎,在Unix系统中广泛使用,这对正则表达式的普及起到了关键作用。
-
1986年:Philip Hazel开发了PCRE(Perl Compatible Regular Expressions)库,它是一种正则表达式库,允许在不同编程语言中使用Perl风格的正则表达式。
-
1997年:IEEE发布了POSIX.2标准,其中包括了正则表达式的标准规范,这使得正则表达式在不同Unix系统中的行为更加一致。
-
2000年代以后:正则表达式在计算机编程和文本处理中变得越来越流行,支持正则表达式的编程语言和工具变得更加丰富和强大,如Perl、Python、Java、JavaScript等。
-
当前:正则表达式仍然是文本处理和数据提取的重要工具,它在数据科学、文本分析、网络爬虫、字符串搜索和替换等领域都有广泛的应用。
四.正则表达式------基本格式
正则表达式基本格式如下所示:
bash
/pattern/flags
pattern 表示模式,flags 表示修饰符
模式放在斜杠 /之间,斜杠后面添加修饰符,修饰符包含ì,g,m等,修饰符放在斜杠的第二个斜杠后面。
详细介绍:
模式(Pattern):
模式是正则表达式的主体部分,它由各种字符和元字符组成,定义了要匹配的文本式。例如,[a-zA-Z]+ 是一个模式,表示匹配一个或多个字母。
斜杠(/):
。斜杠用于包围正则表达式的模式,将其限定在两个斜杠之间。例如,/pattern/.
修饰符(Flags)
i :表示不区分大小写匹配。
g :表示全局匹配,即匹配所有而非仅匹配第一个。
m :表示多行匹配,即^和$可以匹配字符串中每一行的开头和结尾
五.正则表达式 - 修饰符
在正则表达式中,修饰符(又称标志或标记)用于调整正则表达式的行为,提供特定的匹配控制。这些修饰符可以影响正则表达式的全局性、区分大小写、匹配多行等属性。修饰符的语法在不同的编程语言和工具中可能会有所不同。
常见的正则表达式修饰符
以下是一些最常见的修饰符,以及它们的作用:
-
g
(全局匹配):启用全局匹配,意味着正则表达式将继续搜索整个字符串,而不是仅仅在找到第一个匹配后停止。 -
i
(忽略大小写):忽略字母的大小写。这意味着正则表达式中的字母不区分大写或小写。 -
m
(多行匹配) :启用多行匹配,将正则表达式的^
和$
视为每一行的开始和结束,而不仅仅是整个字符串的开始和结束。 -
s
(单行匹配) :启用单行模式,使正则表达式中的.
匹配包括换行符在内的任何字符。 -
x
(扩展模式):允许在正则表达式中包含空格和注释,以增加可读性。 -
u
(Unicode模式):启用对Unicode字符的全面支持,确保正则表达式能够正确处理Unicode字符。 -
U
(非贪婪模式):将正则表达式中的贪婪量词变为非贪婪模式,意味着它们会尽可能匹配较少的字符。
六.正则表达式-元字符
正则表达式中的元字符(metacharacters)是具有特殊含义的字符,它们用于构建和描述复杂的字符串匹配模式。元字符是正则表达式的核心部分,它们决定了正则表达式的匹配行为和操作方式。
以下是所有主要的元字符及其含义:
基础元字符
.
(点):匹配除换行符外的任何单个字符。在某些环境中(如单行模式),它也可以匹配换行符。^
(插入符号):匹配字符串的开始。在多行模式下,它也匹配每一行的开头。$
(美元符号):匹配字符串的结束。在多行模式下,它也匹配每一行的结尾。*
(星号):匹配前一个字符零次或多次。+
(加号):匹配前一个字符一次或多次。?
(问号):匹配前一个字符零次或一次。|
(竖线):逻辑或,匹配左边或右边的表达式。()
(括号):用于分组和捕获子表达式,可以用于提取匹配的部分。[]
(方括号) :用于指定字符集或字符范围。例如,[a-z]
匹配小写字母,[0-9]
匹配数字。{}
(大括号) :用于指定匹配次数,例如,{3}
表示恰好三次,{1,3}
表示一到三次。
转义字符
\
(反斜杠) :用于转义元字符,以便将其视为普通字符。例如:\.
用于匹配点,\*
用于匹配星号。
边界元字符
\b
(单词边界):匹配单词的边界。\B
(非单词边界):匹配非单词边界。- **
\d
:匹配任何数字,相当于[0-9]
。 - **
\D
:匹配任何非数字字符。 - **
\w
:匹配字母、数字、下划线,相当于[a-zA-Z0-9_]
。 - **
\W
:匹配任何非字母、数字、下划线的字符。 - **
\s
:匹配空白字符,包括空格、制表符、换行符等。 - **
\S
:匹配非空白字符。
贪婪和非贪婪模式
正则表达式的量词默认是贪婪的,它们尝试匹配尽可能多的字符。使用?
可以将量词转为非贪婪:
*?
:匹配前一个字符零次或多次,但非贪婪。+?
:匹配前一个字符一次或多次,但非贪婪。??
:匹配前一个字符零次或一次,但非贪婪。{n,m}?
:非贪婪地匹配前一个字符至少n
次,最多m
次。
七.正则表达式 - 运算符优先级
正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。
相同优先级的从左到右进行运算,不同优先级的运算先高后低。下表从最高到最低说明了各种正则表达式运算符的优先级顺序:
运算符 | 描述 |
---|---|
\ | 转义符 |
(), (?:), (?=), [] | 圆括号和方括号 |
*, +, ?, {n}, {n,}, {n,m} | 限定符 |
^, $, \任何元字符、任何字符 | 定位点和序列(即:位置和顺序) |
| | 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。 |
以下是一些常见正则表达式运算符按照优先级从高到低的顺序:
-
转义符号:
\
是用于转义其他特殊字符的转义符号。它具有最高的优先级。示例:
\d
、\.
等,其中\d
匹配数字,\.
匹配点号。 -
括号: 圆括号
()
用于创建子表达式,具有高于其他运算符的优先级。示例:
(abc)+
匹配 "abc" 一次或多次。 -
量词: 量词指定前面的元素可以重复的次数。
示例:
a*
匹配零个或多个 "a"。 -
字符类: 字符类使用方括号
[]
表示,用于匹配括号内的任意字符。示例:
[aeiou]
匹配任何一个元音字母。 -
断言: 断言是用于检查字符串中特定位置的条件的元素。
示例:
^
表示行的开头,$
表示行的结尾。 -
连接: 连接在没有其他运算符的情况下表示字符之间的简单连接。
示例:
abc
匹配 "abc"。 -
管道: 管道符号
|
表示"或"关系,用于在多个模式之间选择一个。示例:
cat|dog
匹配 "cat" 或 "dog"。
八.正则表达式-匹配规则
正则表达式的匹配规则指的是正则表达式如何解释和应用于文本,以确定字符串是否符合给定的模式。理解这些匹配规则对于编写有效的正则表达式至关重要。
1. 字面匹配
正则表达式可以包含字面字符,即直接匹配它们自身的字符。例如,abc
只匹配完全相同的字符串。
2. 特殊字符
正则表达式中的特殊字符具有特定的含义,用于描述复杂的匹配模式。为了匹配特殊字符本身,需要使用转义字符 \
进行转义。
3. 元字符
正则表达式中具有特殊含义的字符包括:.
、*
、+
、?
、^
、$
、[]
、{}
、()
、|
等。以下是一些常见的元字符及其匹配规则:
.
:匹配任何单个字符,除了换行符。在单行模式下(启用修饰符s
),也可以匹配换行符。^
和$
:分别匹配字符串的开头和结尾。在多行模式下(启用修饰符m
),它们也匹配每一行的开头和结尾。*
、+
、?
:分别表示匹配前一个字符零次或多次、一次或多次、零次或一次。[]
:用于定义字符集或字符范围。[a-z]
匹配从a
到z
的任意小写字母。|
:逻辑或,匹配其中一个表达式。()
:用于分组,并可用于捕获匹配的子表达式。
4. 边界匹配
正则表达式可以匹配特定位置或边界:
\b
:匹配单词的边界。\B
:匹配非单词边界。^
和$
:用于匹配字符串的开头和结尾。
5. 贪婪与非贪婪
正则表达式中的量词默认是贪婪的,这意味着它们会尽可能匹配更多字符。非贪婪匹配会尽可能匹配更少字符,通常通过在量词后面加上 ?
来实现。
*?
:非贪婪匹配前一个字符零次或多次。+?
:非贪婪匹配前一个字符一次或多次。??
:非贪婪匹配前一个字符零次或一次。
6. 修饰符
修饰符可以改变正则表达式的匹配规则:
g
(全局匹配):在整个字符串中进行匹配。i
(忽略大小写):不区分大小写。m
(多行模式) :让^
和$
匹配每一行的开头和结尾。s
(单行模式) :使.
匹配包括换行符在内的任何字符。
7. 零宽度匹配
一些正则表达式匹配是零宽度的,即不消耗字符,但指示特定位置或条件。
^
、$
:匹配字符串的开头和结尾。\b
:匹配单词边界。\B
:匹配非单词边界。
九.示例
bash
基本匹配
匹配特定单词
正则表达式:hello
匹配内容:字符串中包含 hello 的部分。
匹配特定模式
正则表达式:abc
匹配内容:字符串中包含 abc 的部分。
重复和量词
匹配任意数量的字符
正则表达式:a.*b
匹配内容:a 和 b 之间可以包含任意数量的字符。
匹配至少一次
正则表达式:a+b
匹配内容:至少一个 a 后面是 b。
匹配零次或多次
正则表达式:ab*
匹配内容:a 后面可以有零次或多次 b。
匹配可选字符
正则表达式:colou?r
匹配内容:color 或 colour。
字符集和范围
匹配一组字符中的任意一个
正则表达式:[aeiou]
匹配内容:任意元音字母。
匹配字符范围
正则表达式:[a-z]
匹配内容:小写字母。
匹配非字符集
正则表达式:[^aeiou]
匹配内容:非元音的字符。
边界匹配
匹配行的开始和结束
正则表达式:^start
匹配内容:以 start 开头的字符串。
正则表达式:end$
匹配内容:以 end 结尾的字符串。
单词边界
正则表达式:\bword\b
匹配内容:整个单词 word。
分组和引用
使用分组
正则表达式:(abc)+
匹配内容:一个或多个 abc。
使用引用
正则表达式:(\d{3})-\1
匹配内容:形式如 123-123 的字符串。
逻辑或
匹配其中之一
正则表达式:dog|cat
匹配内容:dog 或 cat。
贪婪和非贪婪匹配
贪婪匹配
正则表达式:<.*>
匹配内容:包含在 < 和 > 之间的最长字符串。
非贪婪匹配
正则表达式:<.*?>
匹配内容:包含在 < 和 > 之间的最短字符串。