Regular Expression(正则表达式)
1、简介
正则表达式:由普通字符和特殊字符组成的字符串,这个字符串构成了一个搜索模式(pattern),被用来在文本中进行搜索、匹配、替换或分割操作。
语法格式: /pattern/flags pattern 表示模式 flags 表示修饰符
主要用途
- 文本搜索与匹配:快速判断一段文本中是否包含符合特定模式的子串。
- 文本替换:将文本中所有匹配特定模式的部分替换为新的内容。
- 文本提取与分割:从一大段文本中精确地提取出我们关心的部分,或者根据特定的分隔符将文本切分成数组。
应用场景
- 数据验证:确保用户输入的数据符合预期的格式。
- 文本搜索与过滤:大量文本中快速定位信息。
- 文本替换与清洗:批量修改文本内容,使其规范化。
- 文本提取与解析:从非结构化的文本中提取结构化的数据。
- 字符串分割:使用复杂的规则,而不仅仅是单个字符,来分割字符串。
2、正则表达式字符和特性
字符匹配
-
普通字符:包括没有显式指定为元字符的所有可打印和不可打印字符。
ASCII可打印字符:空格,数字,字母,标点符号和符号
非打印字符:换行\\n,回车\\r,制表\\t等控制字符
-
元字符:元字符具有特殊的含义。
基本元字符
- .:匹配任意字符(除了换行符)。
- ^:匹配字符串的开头。
- $:匹配字符串的结尾。
- \\:转义字符,用于匹配特殊字符本身。
量词元字符(限定符)
限定符出现在范围表达式之后,因此它应用于整个范围表达式
- *:匹配前面的模式零次或多次。
- +:匹配前面的模式一次或多次。
- ?:匹配前面的模式零次或一次。
- {n}:匹配前面的模式恰好 n 次。
- {n,}:匹配前面的模式至少 n 次。
- {n,m}:匹配前面的模式至少 n 次且不超过 m 次。
*,+ 限定符都是贪婪的,它们会尽可能多地匹配文字。在它们的后面加上一个 ? 就可以实现非贪婪或最小匹配
边界匹配元字符(定位符)
- \\b:匹配单词边界。
- \\B:匹配非单词边界。
不能将限定符与定位符一起使用
分组和选择元字符
- ( ):用于分组和捕获子表达式。
- (?: ):用于分组但不捕获子表达式。
- |:“或”关系
正向和负向预查
- ?=:exp1(?=exp2):查找 exp2 前面的 exp1(正向前查)
- ?<=:(?<=exp2)exp1:查找 exp2 后面的 exp1(正向后查)
- ?!:exp1(?!exp2):查找后面不是 exp2 的 exp1(负向前查)
- ?<!:(?<!exp2)exp1:查找前面不是 exp2 的 exp1(负向后查)
字符类元字符
- [ ]:匹配括号内的任意一个字符。例如,[abc] 匹配字符 “a”、“b” 或 “c”。
- [^ ]:匹配除了括号内的字符以外的任意一个字符。例如,[^abc] 匹配除了字符 “a”、“b” 或 “c” 以外的任意字符。
- -:在字符类中表示范围
特殊字符类元字符
- \\d:匹配任意数字,等价于 [0-9]
- \\D:匹配任意非数字,等价于 [^0-9]
- \\w:匹配任意单词字符(字母、数字、下划线),等价于 [a-zA-Z0-9_]
- \\W:匹配任意非单词字符,等价于 [^a-zA-Z0-9_]
- \\s:匹配任意空白字符(空格、制表符、换行符等)
- \\S:匹配任意非空白字符
其他元字符
- \\n:匹配换行符
- \\t:匹配制表符
- \\r:匹配回车符
- \\f:匹配换页符
- \\v:匹配垂直制表符
3、修饰符
正则表达式修饰符(也称为模式修饰符或标记)是用于改变正则表达式匹配行为的特殊指令
i (ignore case) – 忽略大小写
- 使匹配不区分大小写。示例:/abc/i 可以匹配 “abc”, “Abc”, “ABC” 等
g (global) – 全局匹配
- 查找所有匹配项,而不是在第一个匹配后停止。示例:在字符串 “ababab” 中,/ab/g 会匹配所有三个 “ab”
m (multiline) – 多行模式
- 改变 ^ 和 $ 的行为,使其匹配每行的开头和结尾,而不仅是整个字符串的开头和结尾。示例:在多行字符串中,/^abc/m 会匹配每行开头的 “abc”
s (single line/dotall) – 单行模式
- 使点号 . 匹配包括换行符在内的所有字符
- 在JavaScript中称为"dotall"模式,使用 /s 修饰符。示例:/a.b/s 可以匹配 “a\\nb”
u (unicode) – Unicode模式
- 启用完整的Unicode支持
- 正确处理UTF-16代理对和Unicode字符属性。示例:/\\p{Script=Greek}/u 可以匹配希腊字母
y (sticky) – 粘性匹配
- 从目标字符串的当前位置开始匹配(使用lastIndex属性)
- 类似于^锚点,但针对的是匹配的起始位置。示例:在JavaScript中,/a/y 会从lastIndex开始匹配 “a”
x (extended) – 扩展模式
- 忽略模式中的空白和注释,使正则表达式更易读。示例:在PHP中,/a b c/x 等同于 /abc/
4、运算优先级
优先级从高到低的顺序
-
转义符号: \\ 是用于转义其他特殊字符的转义符号。它具有最高的优先级。
-
括号: 圆括号 () 用于创建子表达式,具有高于其他运算符的优先级。
-
量词: 量词指定前面的元素可以重复的次数。
-
字符类: 字符类使用方括号 [] 表示,用于匹配括号内的任意字符。
-
断言: 断言是用于检查字符串中特定位置的条件的元素。
示例:^ 表示行的开头,$ 表示行的结尾。
-
连接: 连接在没有其他运算符的情况下表示字符之间的简单连接。
示例:abc 匹配 “abc”。
-
管道: 管道符号 | 表示"或"关系,用于在多个模式之间选择一个。
示例:cat|dog 匹配 “cat” 或 “dog”。






