正则表达式是一种用来描述字符串模式的工具,用于匹配、搜索和替换文本中的特定模式。它是由字符和操作符组成的表达式,可以用来检查字符串是否符合某种模式或进行字符串的匹配和替换操作。正则表达式在文本处理、数据提取、字符串匹配等领域都有广泛的应用。
主要用途
- 文本搜索和替换:在文本编辑器或编程语言中查找和替换特定的文本模式。
- 数据验证:验证输入数据是否符合特定格式,如电子邮件地址、电话号码等。
- 字符串分割:将字符串按照指定的分隔符拆分成多个子字符串。
基本语法
- 字面量字符:直接匹配字符本身,例如 a 匹配字符 a。
- 元字符:具有特殊含义的字符,例如 . 匹配任意单个字符,* 表示前面的字符可以出现零次或多次。
- 字符类:用方括号 [ ] 表示一组字符中的任意一个,例如 [abc] 匹配 a、b 或 c 中的任意一个。
- 量词:控制前一个元素的出现次数,例如 + 表示一次或多次,? 表示零次或一次。
- 锚点:匹配字符串的开始或结束位置,例如 ^ 匹配行首,$ 匹配行尾。
正则表达式规则
- 基本元字符
-
.:匹配除换行符外的任何单个字符。 -
^:匹配字符串的开始位置。 -
$:匹配字符串的结束位置。 -
*:匹配前面的子表达式零次或多次。 -
+:匹配前面的子表达式一次或多次。 -
?:匹配前面的子表达式零次或一次。 -
{n}:匹配前面的子表达式恰好 n 次。 -
{n,}:匹配前面的子表达式至少 n 次。 -
{n,m}:匹配前面的子表达式至少 n 次,但不超过 m 次。
- 字符类
-
[abc]:匹配方括号内的任意一个字符。 -
[^abc]:匹配不在方括号内的任意一个字符。 -
[a-z]:匹配从 a 到 z 的任意一个小写字母。 -
[A-Z]:匹配从 A 到 Z 的任意一个大写字母。 -
[0-9]:匹配从 0 到 9 的任意一个数字。
- 预定义字符类
-
\d:匹配任意一个数字,等同于 [0-9]。 -
\D:匹配任意一个非数字,等同于 [^0-9]。 -
\w:匹配任意一个字母、数字或下划线,等同于 [a-zA-Z0-9_]。 -
\W:匹配任意一个非字母、数字或下划线,等同于 [^a-zA-Z0-9_]。 -
\s:匹配任意一个空白字符,包括空格、制表符、换页符等。 -
\S:匹配任意一个非空白字符。
- 分组和引用
-
( ):将多个字符组合成一个单元,以便进行量词操作或捕获子表达式。
# 示例
(hello) world \1 可以匹配 "hello world hello"
(hello) \1 world 可以匹配 "hello hello world"
(hello).*\1 匹配任意位置出现两次 "hello" 的字符串
(hello) world \1 匹配 "hello world hello" 这样的结构
-
|:表示“或”关系,匹配左边或右边的表达式。 -
\1, \2, …:引用前面捕获的子表达式。
- 断言
-
(?=pattern):正向先行断言,用于匹配后面跟着特定模式的位置。
# 示例
\d+(?=元) 能够匹配后面跟着"元"的数字,比如从"23元"中提取"23"
-
(?!pattern):负向先行断言,匹配后面不跟着特定模式的位置。
# 示例
\d+(?!元|\d) 可以匹配后面不是"元"也不是数字的数字
-
(?<=pattern):正向后行断言,匹配前面是特定模式的位置。
# 示例
(?<=\$)\d+ 能够匹配前面是美元符号的数字,在 "$100" 中匹配到 "100"
-
(?<!pattern):负向后行断言,匹配前面不是特定模式的位置。
# 示例
(?<!$)\d+ 匹配前面不是美元符号的数字,在 "$100" 中匹配到 "100"
场景示例
- 匹配标准邮箱地址:
[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
- 校验密码强度
密码的强度必须是包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间。
^(?=.*\d)(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]{8,10}$