正则表达式
正则表达式详解表
核心概念
正则表达式是一种用于描述文本模式 的语法。它允许你进行复杂的搜索、替换、提取和验证操作。
| 类别 | 元字符/语法 | 描述 | 示例 | 示例匹配结果 |
|---|---|---|---|---|
| 普通字符 | 字母、数字等 | 匹配字符本身。 | abc |
"abc" (在 "123 abc xyz" 中) |
1. 字符匹配
| 类别 | 元字符/语法 | 描述 | 示例 | 示例匹配结果 |
|---|---|---|---|---|
| 任意字符 | . |
匹配任意一个字符(除换行符外)。 | a.c |
"abc", "a c", "a@c" |
| 字符集 | [abc] |
匹配方括号内的任意一个字符。 | [aeiou] |
在 "cat" 中匹配 "a" |
| 字符范围 | [a-z], [0-9] |
匹配指定范围内的任意一个字符。 | [A-Za-z] |
匹配任何一个大写或小写字母 |
| 否定字符集 | [^abc] |
匹配不在方括号内的任意一个字符。 | [^0-9] |
在 "a1" 中匹配 "a" |
| 预定义字符集 | \d |
匹配一个数字 。等价于 [0-9]。 |
user\d |
"user1", "user5" |
\D |
匹配一个非数字 。等价于 [^0-9]。 |
\D+ |
在 "Price: $100" 中匹配 "Price: $" |
|
\w |
匹配一个单词字符(字母、数字、下划线)。 | \w+ |
在 "Hello, world!" 中匹配 "Hello" 和 "world" |
|
\W |
匹配一个非单词字符(如标点、空格)。 | \W |
在 "a b" 中匹配空格 |
|
\s |
匹配一个空白字符(空格、制表符等)。 | a\sb |
"a b" (a和b之间有空格) |
|
\S |
匹配一个非空白字符。 | \S+ |
在 "a b" 中匹配 "a" 和 "b" |
2. 数量词(限定符)
| 类别 | 元字符/语法 | 描述 | 示例 | 示例匹配结果 |
|---|---|---|---|---|
| 零次或多次 | * |
匹配前面的元素零次或多次(尽可能多)。 | ab*c |
"ac", "abc", "abbc" |
| 一次或多次 | + |
匹配前面的元素一次或多次(尽可能多)。 | ab+c |
"abc", "abbc" (不能匹配 "ac") |
| 零次或一次 | ? |
匹配前面的元素零次或一次。 | colou?r |
"color", "colour" |
| 指定次数 | {n} |
匹配前面的元素恰好 n 次。 | \d{4} |
"2023", "1234" |
| 范围次数 | {n,} |
匹配前面的元素至少 n 次。 | \d{2,} |
"123", "12", "12345" |
| 范围次数 | {n,m} |
匹配前面的元素至少 n 次,至多 m 次。 | \d{2,4} |
"12", "123", "1234" |
3. 位置锚点
| 类别 | 元字符/语法 | 描述 | 示例 | 示例匹配结果 |
|---|---|---|---|---|
| 开始位置 | ^ |
匹配字符串的开始。 | ^Hello |
在 "Hello world" 中匹配 "Hello" |
| 结束位置 | $ |
匹配字符串的结束。 | world$ |
在 "Hello world" 中匹配 "world" |
| 单词边界 | \b |
匹配单词的开始或结束位置。 | \bcat\b |
在 "a cat" 中匹配 "cat",但在 "category" 中不匹配 |
| 非单词边界 | \B |
匹配非单词边界的位置。 | \Bcat\B |
在 "category" 中匹配 "cat",但在 "a cat" 中不匹配 |
4. 分组与选择
| 类别 | 元字符/语法 | 描述 | 示例 | 示例匹配结果 |
|---|---|---|---|---|
| 捕获分组 | (abc) |
将多个元素作为一个分组,可被引用或提取。 | (\d{3})-(\d{4}) |
在 "123-4567" 中,分组1为 "123",分组2为 "4567" |
| 非捕获分组 | (?:abc) |
只分组,不捕获(不分配组号)。 | (?:www\.)?(example\.com) |
匹配 "example.com" 和 "www.example.com",但只捕获域名部分 |
| 选择 | ` | ` | 匹配左边或右边的表达式。 | `cat |
| 反向引用 | \1, \2... |
引用前面第 n 个捕获分组匹配的文本。 | (\w+) \1 |
在 "hello hello" 中匹配 "hello hello" |
5. 转义与模式修饰符
| 类别 | 元字符/语法 | 描述 | 示例 |
|---|---|---|---|
| 转义字符 | \ |
将特殊字符(元字符)转义为普通字符。 | \. 匹配字面的点 .,而不是任意字符 |
| 模式修饰符 | i (不区分大小写) |
使匹配对大小写不敏感。 | /hello/i 可以匹配 "Hello", "HELLO" |
g (全局匹配) |
找到所有匹配,而不是在第一个匹配后停止。 | 在 "a a a" 中,/a/g 会匹配到三个 "a" |
|
m (多行模式) |
使 ^ 和 $ 匹配每行的开头和结尾。 |
在多行文本中,/^\d+/gm 会匹配每一行开头的数字 |
综合应用示例
| 场景 | 正则表达式模式 | 描述 |
|---|---|---|
| 邮箱地址 | [\w\.-]+@[\w\.-]+\.\w+ |
匹配常见的邮箱格式。 |
| 手机号(简单中国) | 1[3-9]\d{9} |
匹配以1开头,第二位为3-9的11位数字。 |
| URL | https?://[^\s/$.?#].[^\s]* |
匹配以 http:// 或 https:// 开头的URL。 |
| 日期 (YYYY-MM-DD) | \d{4}-\d{2}-\d{2} |
匹配如 "2023-10-05" 的日期。 |
| 强密码验证 | ^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$ |
至少一个小写字母、一个大写字母、一个数字,且长度至少8位。 |
| HTML标签 | `<([a-z]+)([^<]+)(?:>(.)</\1> | \s+/>)` |
如何使用这些表格?
- 从问题出发:先明确你想匹配什么样的文本(例如:所有数字、以某个词开头的句子、邮箱地址)。
- 查找对应工具 :在表格中找到能实现你目标的元字符(例如:匹配数字用
\d,匹配开头用^)。 - 组合构建:将这些元字符像搭积木一样组合起来,形成最终的正则表达式。
- 测试验证:使用在线的正则表达式测试工具(如 regex101.com)来测试你的表达式,确保它能正确工作。
好的,这是将您提供的正则表达式内容整理成的表格:
正则表达式语法参考表
基本元字符
| 字符 | 描述 | 示例 | 示例说明 |
|---|---|---|---|
\ |
转义字符,将特殊字符转为字面意义 | \n \\( |
匹配换行符、匹配"(" |
^ |
匹配输入字符串的开始位置 | ^Hello |
匹配以Hello开头的字符串 |
$ |
匹配输入字符串的结束位置 | world$ |
匹配以world结尾的字符串 |
. |
匹配除"\n"外的任何单个字符 | a.c |
匹配abc、a c等 |
数量词(限定符)
| 字符 | 描述 | 示例 | 示例说明 |
|---|---|---|---|
* |
匹配前面子表达式0次或多次 | zo* |
匹配z、zo、zoo |
+ |
匹配前面子表达式1次或多次 | zo+ |
匹配zo、zoo,不匹配z |
? |
匹配前面子表达式0次或1次 | do(es)? |
匹配do、does中的do |
{n} |
匹配确定的n次 | o{2} |
匹配food中的oo |
{n,} |
至少匹配n次 | o{2,} |
匹配foooood中的所有o |
{n,m} |
最少n次,最多m次 | o{1,3} |
匹配foooood中的前三个o |
?(非贪婪) |
紧跟在限制符后表示非贪婪模式 | o+? |
对于"oooo"只匹配单个o |
字符集合
| 字符 | 描述 | 示例 | 示例说明 |
|---|---|---|---|
[xyz] |
字符集合,匹配包含的任意字符 | [abc] |
匹配plain中的a |
[^xyz] |
负值字符集合,匹配未包含的字符 | [^abc] |
匹配plain中的p |
[a-z] |
字符范围,匹配指定范围内字符 | [a-z] |
匹配a到z的任意小写字母 |
[^a-z] |
负值字符范围,匹配不在范围内的字符 | [^a-z] |
匹配不在a到z范围的字符 |
| `x | y` | 匹配x或y | `z |
分组与引用
| 字符 | 描述 | 示例 | 示例说明 |
|---|---|---|---|
(pattern) |
匹配pattern并获取匹配 | (\d{3}) |
捕获三位数字分组 |
(?:pattern) |
匹配pattern但不获取匹配 | `industr(?:y | ies)` |
(?=pattern) |
正向预查 | `Windows (?=95 | 98)` |
(?!pattern) |
负向预查 | `Windows (?!95 | 98)` |
预定义字符集
| 字符 | 描述 | 等价于 |
|---|---|---|
\d |
匹配数字字符 | [0-9] |
\D |
匹配非数字字符 | [^0-9] |
\s |
匹配任何空白字符 | [ \f\n\r\t\v] |
\S |
匹配任何非空白字符 | [^ \f\n\r\t\v] |
\w |
匹配单词字符 | [A-Za-z0-9_] |
\W |
匹配非单词字符 | [^A-Za-z0-9_] |
边界匹配
| 字符 | 描述 | 示例 | 示例说明 |
|---|---|---|---|
\b |
匹配单词边界 | er\b |
匹配never中的er,不匹配verb中的er |
\B |
匹配非单词边界 | er\B |
匹配verb中的er,不匹配never中的er |
特殊字符转义
| 字符 | 描述 | 示例 |
|---|---|---|
\f |
匹配换页符 | 等价于\x0c和\cL |
\n |
匹配换行符 | 等价于\x0a和\cJ |
\r |
匹配回车符 | 等价于\x0d和\cM |
\t |
匹配制表符 | 等价于\x09和\cI |
\v |
匹配垂直制表符 | 等价于\x0b和\cK |
\cM |
匹配Control-M或回车符 | x必须为A-Z或a-z之一 |
\xn |
十六进制转义值 | \x41匹配"A" |
\un |
Unicode字符 | \u00A9匹配版权符号© |
向后引用
| 字符 | 描述 | 示例 | 示例说明 |
|---|---|---|---|
\num |
对所获取匹配的引用 | (.)\1 |
匹配两个连续的相同字符 |
\n |
八进制转义值或向后引用 | ||
\nm |
八进制转义值或向后引用 | ||
\nml |
八进制转义值 | n为0-3,m和l为0-7 |
扩展预查语法
| 语法 | 描述 | 示例 | 示例说明 |
|---|---|---|---|
(?=E) |
表达式后面紧跟着E才匹配 | const(?=\s+char) |
匹配const且其后必须有char |
(?!E) |
表达式后面没有紧跟着E才匹配 | const(?!\s+char) |
匹配const且其后不能有char |