Files
QieKan-3.0/docs/dev/regex.md
T

124 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 正则表达式
正则表达式(Regular Expression)用于在文本中匹配、查找和替换特定模式。Legado 源规则中,以 `:`
开头的规则即为正则表达式,可用于书籍列表和目录列表的提取。
[[toc]]
## 基本匹配
正则表达式是我们用于在文本中检索字母和数字的模式。例如正则表达式 `cat`,表示:字母 `c` 后面跟着一个字母
`a`,再后面跟着一个字母 `t`
正则表达式通常区分大小写,因此 `Cat` 与字符串 "cat" 不匹配。
## 元字符
元字符是正则表达式的基本组成元素。
| 元字符 | 说明 |
|:-------:|-----------------------|
| `.` | 匹配除换行符以外的任意字符 |
| `[ ]` | 字符类,匹配方括号中包含的任意字符 |
| `[^ ]` | 否定字符类,匹配方括号中不包含的任意字符 |
| `*` | 匹配前面的子表达式零次或多次 |
| `+` | 匹配前面的子表达式一次或多次 |
| `?` | 匹配前面的子表达式零次或一次 |
| `{n,m}` | 匹配前面字符至少 n 次,但不超过 m 次 |
| `(xyz)` | 字符组,按照确切的顺序匹配字符 xyz |
| `\|` | 分支结构,匹配符号之前的字符或后面的字符 |
| `\` | 转义符 |
| `^` | 匹配行的开始 |
| `$` | 匹配行的结束 |
### 英文句号
`.` 可以匹配任意单个字符,但不会匹配换行符。例如 `.ar` 匹配 "car"、"par"、"gar"。
### 字符集
字符集(字符类)使用方括号指定。例如 `[Tt]he` 匹配 "The" 或 "the"。
**否定字符集**`^` 在方括号内出现时会取消字符集。例如 `[^c]ar` 匹配除了 "car" 以外的 "par"、"gar"。
### 重复
- **星号 `*`**:匹配上一个匹配规则的零次或多次。例如 `[a-z]*` 匹配一行中任意数量的小写字母。
- **加号 `+`**:匹配上一个字符的一次或多次。例如 `c.+t` 匹配 "cat sat on the mat"。
- **问号 `?`**:表示前一个字符是可选的。例如 `[T]?he` 同时匹配 "The" 和 "he"。
### 花括号(量词)
用于指定字符或一组字符可以重复的次数。例如 `[0-9]{2,3}` 匹配至少 2 位但不超过 3 位数字。
### 字符组
写在圆括号内的子模式 `(...)`。例如 `(ab)*` 匹配零个或多个 "ab"。`(c|g|p)ar` 匹配 "car"、"gar" 或 "par"。
### 分支结构
`|` 用来定义分支结构。字符集只在字符级别上有作用,而分支结构在表达式级别上依然可以使用。
### 转义特殊字符
使用 `\` 来转义下一个字符。例如 `(f|c|m)at\.?` 匹配 "fat"、"cat"、"mat" 以及可选的 "." 字符。
### 定位符
- `^` 检查匹配字符是否是起始字符
- `$` 检查匹配字符是否是最后一个字符
## 简写字符集
| 简写 | 说明 |
|:----:|-----------------------------|
| `.` | 匹配除换行符以外的任意字符 |
| `\w` | 匹配所有字母和数字的字符:`[a-zA-Z0-9_]` |
| `\W` | 匹配非字母和数字的字符:`[^\w]` |
| `\d` | 匹配数字:`[0-9]` |
| `\D` | 匹配非数字:`[^\d]` |
| `\s` | 匹配空格符:`[\t\n\f\r\p{Z}]` |
| `\S` | 匹配非空格符:`[^\s]` |
## 断言
| 符号 | 说明 |
|:-----:|--------|
| `?=` | 正向先行断言 |
| `?!` | 负向先行断言 |
| `?<=` | 正向后行断言 |
| `?<!` | 负向后行断言 |
**正向先行断言**:匹配特定模式之后的内容。例如 `(T|t)he(?=\sfat)` 匹配 "The" 或 "the" 后面跟着 "fat"
的情况。
**负向先行断言**:获取不匹配表达式的内容。例如 `(T|t)he(?!\sfat)` 匹配不在 "fat" 前面的 "The" 或 "
the"。
**正向后行断言**:获取在特定模式之前的匹配内容。例如 `(?<=(T|t)he\s)(fat|mat)` 匹配在 "The" 或 "the"
之后的 "fat" 和 "mat"。
**负向后行断言**:获取不在特定模式之前的匹配内容。
## 标记
| 标记 | 说明 |
|:---:|--------|
| `i` | 不区分大小写 |
| `g` | 全局搜索 |
| `m` | 多行匹配 |
## 常用正则表达式
| 用途 | 正则表达式 |
|---------|------------------------------|
| 数字 | `\d+$` |
| 用户名 | `^[\w\d_.]{4,16}$` |
| 字母数字字符 | `^[a-zA-Z0-9]*$` |
| 小写字母 | `[a-z]+$` |
| 大写字母 | `[A-Z]+$` |
| HTML 标签 | `<[^>]+?>` |
| 求更求转发致谢 | `[\((【].*?[求更谢乐发推].*?[】)\)]` |
| 查找最新章节 | `您可以.*?查找最新章节` |
| PS/ps | `(?i)ps\b.*` |