介绍
正则表达式是一种用于匹配和处理文本模式的表达式。它是由字符和特殊字符组成的序列,用来描述一种字符串的匹配模式。在编程和文本处理中,正则表达式被广泛应用于搜索、替换、验证和提取文本数据。
正则表达式的功能:
- 模式匹配: 正则表达式可以根据定义的模式在文本中进行搜索和匹配。例如,搜索所有符合特定模式的字符串,如邮箱地址、电话号码等。
- 文本替换: 可以使用正则表达式进行文本替换。通过匹配特定模式的字符串并替换成指定的内容,可以对文本进行批量替换操作。
- 数据验证: 用于验证输入数据是否符合特定格式。比如验证用户名、密码、邮箱格式是否合法等。
- 文本提取: 可以从文本中提取出符合特定模式的内容。例如,从一段文字中提取URL链接、日期、数字等特定格式的信息。
- 字符串操作: 可以进行字符串的拆分、合并和其他复杂的操作,以符合特定的模式和要求。
正则表达式入门
正则表达式由两种字符构成, 元字符和文字, 一个完整的正则表达式由小的构建模块单元组成
元字符
正则表达式中的元字符是具有特殊含义的字符,它们用于定义匹配模式的基本元素。这些元字符在正则表达式中扮演着特殊角色,代表特定的字符、位置或者数量。
^
: 锚定每一行的开头位置^cat
: 表示以cat开头的行
$
: 锚定每一行的结尾位置cat$
: 表示以cat结尾的行
\<
: 锚定单词的开头
\>
: 锚定单词的结尾
eg:
^$
表示什么? 答案: 空行“锚定”: 锚定和匹配有一定的区别,锚定匹配的是一个位置,匹配是指寻找一个具体的文本。
例如使用
^
锚定开头位置表示你的模式是要从行的开始开始匹配“单词”:有字母或者数字组成的字符串
?
: 可选通配符, 表示前面的字符或者字符组出现0次或者一次, 例如colou?r
可以表示colour
,color
+
:表示前面的字符或者字符组至少出现一次
*
:表示前面的字符或者字符组出现任意次数
“量词”:限定了所作用元素的匹配次数
.
: 通配符,用来匹配任意字符
|
:“或”,表示分支,例如Bob | Robert
可以匹配Bob
或者Robert
, 它的作用范围可以被()
限定, 例如gr(a|e)y
可以匹配gray
或者grey
, 如果不加括号gra|ey
会匹配gra
或者ey
,这显然不符合预期,这一点值得注意
\s
: 匹配所有空白, 包括制表符
\t
: 匹配制表符
\n
: 换行符
\w
:[a-zA-Z0-9]
\W
: 除了\w之外的所有字符
\d
:[0-9]
\D
: 除了\d
之外的所有字符
字符组
[1-9a-zA-Z]
字符组是一对方括号括起来的字符组合, 例如
[12345]
,匹配的时候可以匹配字符组里面的任意一个字符, 相当于一个想要的值的集合,只能选择括号里面的一个进行匹配, 简单来说就是或
的关系例如:
[Rr]egular
: 可以匹配Regular
或者regular
123[45]67
: 可以匹配123467
或者123567
值得注意的是, 有些字符在字符组内的语义会发生变化
-
:
-
在字符组外部表示普通字符,即匹配一个-
-
在字符组里可以表示一个范围, 如[1-9]
,[a-z]
分别表示数字1到9的数字的集合和a到z的字符的集合,即[123456789]
等价于[1-9]
- 如果
-
出现在[]
内部的开头部分, 那它只是表示一个-
字符,失去了范围的语义
- 元字符
- 元字符在字符组里面退化为普通字符,例如
[0-9A-Z!.?*]
里面只有两个-
有特殊语义
^
^
如果出现在[]
的开头部分, 表示该字符组是一个排除型字符组
排除型字符组: 表示除了列举出来的字符之外的全部字符, 相当于取非操作
如:
[^Rr]egular
: 表示只要不是R和r开头的后续跟上egular的字符串, 例如aegular,begular,3egualr等等- 一些常见的字符组包括:
[abc]
: 匹配字符集合中的任意一个字符,这里匹配字符a
、b
或c
中的任意一个。[a-z]
: 表示字符范围,匹配从a
到z
中的任意一个小写字母。[A-Z]
: 同样是字符范围,匹配从A
到Z
中的任意一个大写字母。[0-9]
: 表示匹配任意一个数字。[a-zA-Z]
: 匹配任意一个大小写字母。[^abc]
: 在字符组开头使用^
,表示匹配除了字符集合内的字符以外的任意一个字符。
括号
- 组成模块单元
(R|r)egular
: 表示匹配Regular
或者regular
,eg:比较
^Regular|regular
和^(Regular|regular)
的区别
第一个只限定了Regular需要在行的开头, 但是没有限制regular必须在行开头, 第二个则限制了两个都必须出现在行的开头()
的另一个作用是记住匹配的文本, 方便后面直接引用, 引用方法在不同的框架里面有所不同
eg:
(Regular) is important in \1 Expression
: 可以匹配Regular is important in Regular Expression
转义字符
\
表示转义字符, 可以把元字符转为普通字符串进行匹配, 有时候我们只想要匹配普通的.
,?
,等,这时候就需要在前面加上\
, 否则会当作元字符处理
\
加数字可以用于引用前面的匹配
环视
- 前瞻
前瞻用于检查在当前位置后面的字符是否满足某种条件。
- 肯定前瞻:
(?=...)
检查在当前位置之后是否存在匹配
...
的字符串,但不包括在匹配结果中。示例:
\w+(?=\d)
匹配一个或多个单词字符,前提是后面跟着一个数字,但数字不会包含在匹配结果中。
示例解释:
abc123
中,匹配的是 abc
,因为它后面有数字 123
。- 否定前瞻:
(?!...)
检查在当前位置之后是否不存在匹配
...
的字符串。示例:
\w+(?!\d)
匹配一个或多个单词字符,前提是后面没有数字。
示例解释:
abc123
中,匹配的是 abc
,因为 abc
后面紧跟着数字 123
,不满足条件,因此不匹配。- 后顾
后顾用于检查当前位置之前的字符是否满足某种条件。
- 肯定后顾:
(?<=...)
检查在当前位置之前是否存在匹配
...
的字符串。示例:
(?<=\d)\w+
匹配一个或多个单词字符,前提是前面有一个数字。
示例解释:
123abc
中,匹配的是 abc
,因为它前面有数字 123
。- 否定后顾:
(?<!...)
检查在当前位置之前是否不存在匹配
...
的字符串。示例:
(?<!\d)\w+
匹配一个或多个单词字符,前提是前面没有数字。
示例解释:
abc123
中,匹配的是 abc
,因为 abc
前面没有数字。对正则表达式的匹配原理
正则表达式引擎可以根据实现方式和功能特点进行不同的分类:
- 基于DFA(Deterministic Finite Automaton)的引擎: 使用确定性有限状态自动机实现的引擎。这种引擎对于简单的正则表达式可以提供快速的匹配速度,但对于复杂的模式可能性能较差。
- 基于NFA(Nondeterministic Finite Automaton)的引擎: 使用非确定性有限状态自动机实现的引擎。NFA引擎通常具有更强大的功能和更灵活的语法支持,但在某些情况下可能会牺牲一些性能。
- Backtracking引擎: 这种引擎使用回溯算法来进行匹配。它能够处理更复杂的正则表达式,但在某些情况下可能会导致性能问题,特别是对于包含大量回溯的表达式。
- 基于编译的引擎: 在匹配前将正则表达式转换为内部的优化表示形式。这种引擎能够通过预先编译和优化来提高匹配效率。
- 多模式匹配引擎: 允许同时匹配多个模式,提高了处理多种模式的效率。
- Unicode兼容引擎: 针对Unicode字符集提供了更好的支持,能够处理更多语言和字符编码。
这些分类是根据引擎的实现方式、匹配策略和功能特点而来的。不同的引擎可能有不同的优缺点,适合不同类型的正则表达式和应用场景。选择合适的引擎通常取决于需求、性能要求和匹配的复杂度。
常用场景
- 使用正则表达式修改文本
// 使用Str2替换Str1 s/Str1/Str2
- 从路径中获取文件名
- 去掉文件名开头的路径
- 分别获取文件名和路径
- 匹配对称的括号
速查表
字符 | 描述 |
^ | 锚定每一行的开头位置 ^cat : 表示以cat开头的行 |
$ | 锚定每一行的结尾位置 cat$ : 表示以cat结尾的行 |
[] | 字符组 |
[^] | 排除型字符组 |
. | 匹配任意字符 |
() | 划分单元 |
\< | 锚定单词开头 |
\> | 锚定单词结尾 |
? | 加在字符后面,表示可选项 |
+ | 表示之前紧邻的那个元素出现一次或者多次 |
* | 表示之前紧邻的元素出现任意多次, 包括不出现 |
{min,max} | 量词区间, 限定重复次数 |
ㅤ | ㅤ |
ㅤ | ㅤ |
ㅤ | ㅤ |
ㅤ | ㅤ |
ㅤ | ㅤ |
ㅤ | ㅤ |