# 正则表达式

正则表达式是一种用于匹配和操作文本的强大工具，用于描述要匹配的文本模式。

## 匹配字符

### 普通匹配字符

| 字符       | 描述                                                          |
| :------- | :----------------------------------------------------------- |
| `[xyz]`  | 匹配 `[xyz]` 中列出的所有字符。例如 `[xyz]`，能够匹配目标的所有 x、y、z 字符。          |
| `[^xyz]` | 匹配 `[^xyz]` 中列出的字符外的所有字符。例如 `[^xyz]`，能够匹配目标的除去 x、y、z 外的所有字符。 |
| `[A-Z]`  | `[A-Z]` 表示一个区间，匹配所有大写字母；`[a-z]` 匹配所有小写字母；`[0-9]` 匹配所有数字。    |
| `[\s\S]` | 匹配所有字符（包括换行符）。`\s` 匹配所有空白符（包括换行），`\S` 匹配所有非空白符（不包括换行），两者合并即可匹配任意字符。 |
| `.`      | 匹配除换行符 `\n`、`\r` 之外的任何单个字符，等价于 `[^\n\r]`。                   |
| `\w`     | 匹配字母、数字、下划线，等价于 `[A-Za-z0-9_]`。                             |
| `\d`     | 匹配任意一个阿拉伯数字（0 到 9），等价于 `[0-9]`。                             |

### 非打印字符

| 字符  | 描述                                                         |
| :---- | :----------------------------------------------------------- |
| `\cx` | 匹配由 x 指明的控制字符。例如，`\cM` 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一，否则将 c 视为一个原义的 'c' 字符。 |
| `\f`  | 匹配一个换页符，等价于 `\x0c` 和 `\cL`。                     |
| `\n`  | 匹配一个换行符，等价于 `\x0a` 和 `\cJ`。                     |
| `\r`  | 匹配一个回车符，等价于 `\x0d` 和 `\cM`。                     |
| `\s`  | 匹配任何空白字符，包括空格、制表符、换页符等，等价于 `[ \f\n\r\t\v]`。注意 Unicode 正则表达式会匹配全角空格符。 |
| `\S`  | 匹配任何非空白字符，等价于 `[^ \f\n\r\t\v]`。                |
| `\t`  | 匹配一个制表符，等价于 `\x09` 和 `\cI`。                     |
| `\v`  | 匹配一个垂直制表符，等价于 `\x0b` 和 `\cK`。                 |

### 特殊字符

| 特殊字符 | 描述                                                         |
| :------- | :----------------------------------------------------------- |
| `$`      | 匹配输入字符串的结尾位置。如果设置了 RegExp 对象的 Multiline 属性，则 `$` 也匹配 `\n` 或 `\r`。要匹配 `$` 字符本身，请使用 `\$`。 |
| `( )`    | 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符，请使用 `\(` 和 `\)`。 |
| `*`      | 匹配前面的子表达式零次或多次。要匹配 `*` 字符本身，请使用 `\*`。 |
| `+`      | 匹配前面的子表达式一次或多次。要匹配 `+` 字符本身，请使用 `\+`。 |
| `.`      | 匹配除换行符 `\n` 之外的任何单字符。要匹配 `.` 本身，请使用 `\.`。 |
| `[`      | 标记一个中括号表达式的开始。要匹配 `[`，请使用 `\[`。        |
| `?`      | 匹配前面的子表达式零次或一次，或指明一个非贪婪限定符。要匹配 `?` 字符本身，请使用 `\?`。 |
| `\`      | 将下一个字符标记为特殊字符、原义字符、向后引用或八进制转义符。例如，`\\` 匹配 `\`。 |
| `^`      | 匹配输入字符串的开始位置。在方括号表达式中使用时，表示不接受方括号内的字符集合（取反）。要匹配 `^` 字符本身，请使用 `\^`。 |
| `{`      | 标记限定符表达式的开始。要匹配 `{`，请使用 `\{`。            |
| `|`      | 指明两项之间的一个选择。要匹配 `|`，请使用 `\|`。            |

### 限定符

| 字符    | 描述                                                         |
| :------ | :----------------------------------------------------------- |
| `*`     | 匹配前面的子表达式零次或多次。                               |
| `+`     | 匹配前面的子表达式一次或多次。                               |
| `?`     | 匹配前面的子表达式零次或一次，等价于 `{0,1}`。例如，`do(es)?` 可以匹配 "do" 和 "does"，但不能匹配 "dog"。 |
| `{n}`   | n 是一个非负整数，匹配确定的 n 次。例如，`o{2}` 不能匹配 "Bob" 中的 o，但是能匹配 "food" 中的两个 o。 |
| `{n,}`  | n 是一个非负整数，至少匹配 n 次。例如，`o{2,}` 不能匹配 "Bob" 中的 o，但能匹配 "foooood" 中的所有 o。`o{1,}` 等价于 `o+`，`o{0,}` 等价于 `o*`。 |
| `{n,m}` | m 和 n 均为非负整数，其中 n <= m。最少匹配 n 次且最多匹配 m 次。例如，`o{1,3}` 将匹配 "fooooood" 中的前三个 o。`o{0,1}` 等价于 `o?`。 |

## 常用正则表达式

| 正则表达式                 | 匹配内容   |
| -------------------------- | ---------- |
| `[\u4e00-\u9fa5]`          | 中文字符   |
| `\d{3}-\d{8}|\d{4}-\{7,8}` | 国内手机号 |
|                            |            |
|                            |            |
|                            |            |
|                            |            |
|                            |            |
|                            |            |
|                            |            |

