元字符
| 字符 | 描述 | 示例 |
|---|---|---|
| . | 匹配除换行符外的任意字符 | a.c 匹配 abc, a1c |
| \ | 转义字符,将特殊字符转义为字面量 | a\.c 匹配 a.c |
| | | 或运算符,匹配左边或右边的表达式 | a|b 匹配 a 或 b |
| () | 分组,将多个字符组合为一个单元 | (ab)+ 匹配 ab, abab |
| [] | 字符类,匹配方括号中的任意字符 | [abc] 匹配 a, b, c |
| {} | 量词,指定匹配的次数 | a{3} 匹配 aaa |
量词
| 字符 | 描述 | 示例 |
|---|---|---|
| * | 匹配前面的表达式 0 次或多次 | ab* 匹配 a, ab, abb |
| + | 匹配前面的表达式 1 次或多次 | ab+ 匹配 ab, abb |
| ? | 匹配前面的表达式 0 次或 1 次 | ab? 匹配 a, ab |
| {n} | 精确匹配 n 次 | a{3} 匹配 aaa |
| {n,} | 至少匹配 n 次 | a{2,} 匹配 aa, aaa... |
| {n,m} | 匹配 n 到 m 次 | a{2,4} 匹配 aa 到 aaaa |
| *? | 非贪婪匹配,尽可能少匹配 | a*? 最小匹配 |
| +? | 非贪婪匹配,尽可能少匹配 | a+? 最小匹配 |
字符类
| 字符 | 描述 | 示例 |
|---|---|---|
| [abc] | 匹配 a、b 或 c 中的任意一个 | [aeiou] 匹配元音字母 |
| [^abc] | 匹配除 a、b、c 以外的任意字符 | [^0-9] 匹配非数字 |
| [a-z] | 匹配 a 到 z 范围内的任意字符 | [a-z] 匹配小写字母 |
| [A-Z] | 匹配 A 到 Z 范围内的任意字符 | [A-Z] 匹配大写字母 |
| [0-9] | 匹配 0 到 9 范围内的任意数字 | [0-9] 匹配数字 |
| \d | 匹配数字,等同于 [0-9] | \d+ 匹配数字串 |
| \D | 匹配非数字,等同于 [^0-9] | \D+ 匹配非数字串 |
| \w | 匹配单词字符,等同于 [a-zA-Z0-9_] | \w+ 匹配单词 |
| \W | 匹配非单词字符 | \W+ 匹配非单词 |
| \s | 匹配空白字符(空格、制表符、换行等) | \s+ 匹配空白 |
| \S | 匹配非空白字符 | \S+ 匹配非空白 |
分组与引用
| 字符 | 描述 | 示例 |
|---|---|---|
| (pattern) | 捕获分组,匹配并捕获匹配的文本 | (ab)+ 捕获 ab |
| (?:pattern) | 非捕获分组,只分组不捕获 | (?:ab)+ 不捕获 |
| \1, \2... | 反向引用,引用第 n 个捕获组的内容 | (\w)\1 匹配重复字符 |
| (?<name>pattern) | 命名捕获分组 | (?<year>\d{4}) |
| \k<name> | 引用命名捕获组 | \k<year> |
锚点
| 字符 | 描述 | 示例 |
|---|---|---|
| ^ | 匹配字符串的开始位置 | ^abc 以 abc 开头 |
| $ | 匹配字符串的结束位置 | abc$ 以 abc 结尾 |
| \b | 匹配单词边界 | \bword\b 精确匹配单词 |
| \B | 匹配非单词边界 | \Bword 非单词边界 |
| ^ | 多行模式下匹配每行的开始 | /^abc/m |
| $ | 多行模式下匹配每行的结束 | /abc$/m |
断言
| 字符 | 描述 | 示例 |
|---|---|---|
| (?=pattern) | 正向先行断言,匹配后面是 pattern 的位置 | a(?=b) 匹配后面是 b 的 a |
| (?!pattern) | 负向先行断言,匹配后面不是 pattern 的位置 | a(?!b) 匹配后面不是 b 的 a |
| (?<=pattern) | 正向后行断言,匹配前面是 pattern 的位置 | (?<=a)b 匹配前面是 a 的 b |
| (?<!pattern) | 负向后行断言,匹配前面不是 pattern 的位置 | (?<!a)b 匹配前面不是 a 的 b |
修饰符
| 字符 | 描述 | 示例 |
|---|---|---|
| g | 全局匹配,查找所有匹配项 | /pattern/g |
| i | 忽略大小写 | /pattern/i |
| m | 多行模式,^ 和 $ 匹配每行 | /pattern/m |
| s | 单行模式,. 匹配换行符 | /pattern/s |
| u | Unicode 模式 | /pattern/u |
| y | 粘性匹配,从 lastIndex 开始 | /pattern/y |
常用转义字符
| 字符 | 描述 | 示例 |
|---|---|---|
| \n | 换行符 | 匹配换行 |
| \r | 回车符 | 匹配回车 |
| \t | 制表符(Tab) | 匹配制表符 |
| \0 | 空字符 | 匹配 null 字符 |
| \\ | 反斜杠本身 | 匹配 \ |
| \. | 点号本身 | 匹配 . |
| \* | 星号本身 | 匹配 * |
| \+ | 加号本身 | 匹配 + |
| \? | 问号本身 | 匹配 ? |
| \^ | 脱字符本身 | 匹配 ^ |
| \$ | 美元符本身 | 匹配 $ |
| \[ | 左方括号本身 | 匹配 [ |
| \] | 右方括号本身 | 匹配 ] |
| \( | 左圆括号本身 | 匹配 ( |
| \) | 右圆括号本身 | 匹配 ) |
| \{ | 左花括号本身 | 匹配 { |
| \} | 右花括号本身 | 匹配 } |
| \| | 竖线本身 | 匹配 | |
运算符优先级
| 优先级 | 运算符 | 说明 |
|---|---|---|
| 1 | \ | 转义符 |
| 2 | (), (?:), (?=), [] | 分组和字符类 |
| 3 | *, +, ?, {n}, {n,}, {n,m} | 量词 |
| 4 | ^, $, \b, \B | 锚点和边界 |
| 5 | | | 或运算 |
优先级说明:正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似。相同优先级的从左到右进行运算,不同优先级的运算先高后低。
正则表达式学习指南
从入门到精通,掌握正则表达式的核心概念和实用技巧
什么是正则表达式?
正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于匹配字符串的模式。它使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。正则表达式是文本处理和数据验证的强大工具,几乎所有的编程语言都支持正则表达式。
为什么要学习正则表达式?
- 高效的文本处理:用一行正则表达式可以替代几十行甚至上百行的字符串处理代码。
- 数据验证:验证邮箱、手机号、身份证号、密码强度等输入格式。
- 数据提取:从大量文本中提取需要的信息,如抓取网页中的数据。
- 数据替换:批量替换文本中的特定内容,如代码重构。
- 编辑器进阶:高级编辑器(VS Code、Vim、Sublime等)都支持正则查找替换。
学习建议
1. 从基础开始:先掌握元字符、字符类、量词等基础概念,不要急于求成。
2. 多练习:正则表达式是实践性很强的技能,通过大量练习才能熟练掌握。
3. 使用工具:使用正则测试工具可以帮助你理解和调试正则表达式。
4. 从简单到复杂:先写简单的正则,逐步增加复杂度,不要一开始就写非常复杂的表达式。
5. 可读性优先:复杂的正则表达式可以适当添加注释,或者拆分成多个步骤。
6. 不要过度使用:正则不是万能的,某些场景下用普通的字符串方法可能更清晰高效。