🧩 正则匹配(进阶)
本页讲正则规则:用一条表达式匹配一批标题,避免逐条写精确名称。
有操作难度,建议先确认真的需要
正则规则适合「一批标题共享命名规律」的场景。如果你的问题只是个别几个标题对不上,用 简单精确映射 逐条添加更快、更不容易出错。
本页假定你已经知道正则是什么。完全没接触过请先看 正则入门(新手)。
什么时候该用正则
| 场景 | 适合正则? |
|---|---|
| 只有两三个标题对不上 | ❌ 用精确映射 |
| 一个系列有十几部,标题都以「XX之刃」结尾 | ✅ 适合 |
| 标题带各种清晰度/字幕组后缀,需要先剥掉 | ✅ 适合 |
| 标题差异没有规律 | ❌ 用精确映射或候选确认 |
怎么添加
- 打开 「映射管理」,点添加映射。
- 类型选 「正则规则」。
- 填写三项:
- 正则表达式:Python 正则语法。
- Bangumi ID:命中后要使用的条目 ID。
- 限定季度(可选):填了则规则只在指定季生效。
- 说明(可选):给自己看的备注。
- 用页面底部的 「正则匹配测试」 输入几个真实标题验证。
- 保存。
匹配行为(重要)
理解这几点能避免大多数「为什么没生效」:
- 匹配对象是标题和原始标题,两者都会尝试;任一命中即可。原始标题即媒体库给出的原标题(常为英文/日文原名)。
- 按列表顺序,第一条命中的规则生效。因此:
- 更具体的规则要写在更靠前;
- 兜底用的宽泛规则放最后。
- 使用的是「搜索」而非「完全匹配」。除非你写
^...$锚定首尾,否则只要标题包含该模式就算命中 —— 这既是最常见的好用之处,也是最常见的误伤原因。 - 限定季度填了就只在那一季生效;留空对所有季生效。
- 表达式语法错误或匹配超时(超过 1 秒)的规则会被跳过并记入日志,不会让同步整体失败。
正则速查(Python 语法)
| 写法 | 含义 | 例子 |
|---|---|---|
. | 任意单个字符 | 第.季 匹配「第1季」「第X季」 |
* | 前面的内容重复 0 次或多次 | 之刃* |
+ | 前面的内容重复 1 次或多次 | 第[0-9]+季 |
? | 前面的内容可有可无 | 剧场版? |
[abc] | 括号内任一字符 | [一二三]季 |
[0-9] | 数字;等价于 \d | 第[0-9]季 |
^ | 字符串开头 | ^鬼灭 |
$ | 字符串结尾 | 之刃$ |
| | 或 | 剧场版|电影版 |
(...) | 分组 | (第[0-9]+季) |
(?i) | 忽略大小写 | (?i)blade |
中文标点也要考虑
中文标题里常出现全角括号 ()、中点 ·、空格等。如果标题里确实有,表达式里也要写,或者用 . 代替单个字符。
常用范例
1. 系列作:标题以某词结尾
regex
^.*之刃$^开头、$结尾 → 要求整个标题以「之刃」结束。.*表示前面可以是任意内容。- 命中:「鬼灭之刃」,不命中:「鬼灭之刃 无限列车篇」。
若想连后续篇一起覆盖,去掉 $:
regex
^.*之刃2. 一部作品的所有季度与剧场版
regex
某番剧.*只要标题以「某番剧」开头就命中,无论后面跟的是「第二季」「剧场版」还是别的。
注意误伤
这种宽泛写法也会命中你不想要的条目(比如真人版、衍生作)。务必用「正则匹配测试」把你媒体库里的真实标题都试一遍。
3. 同时覆盖多种叫法
regex
(鬼灭之刃|滅之刃|Kimetsu no Yaiba)用 | 把几种写法并列,任一个出现即命中。适合处理译名不统一。
4. 标题里带季号,但格式不一
regex
^某番剧\s*第[0-9一二三四五六七八九十]+季\s*表示「可以有任意多个空白字符,也可以没有」;[0-9一二三四五六七八九十]+同时接受阿拉伯数字和中文数字。
5. 只匹配某一季(配合「限定季度」)
如果你已经用「限定季度」字段限定了季数,正则本身就不必再判断季号:
regex
^某番剧限定季度填 2 → 只有第 2 季的请求会命中。
6. 忽略大小写
regex
(?i)^blade of demon slayer(?i) 放在开头,让整个表达式忽略大小写,适合英文标题。
请务必先测试
添加/编辑弹窗底部有 「正则匹配测试」:输入真实标题,立即看到是否命中。
建议的测试清单:
- 应该命中的标题 —— 至少 2 个真实样例;
- 不应该命中的相近标题 —— 至少 2 个(这是重点!);
- 你媒体库里同一系列的其它季,确认它们落到了你预期的规则上。
常见错误
规则写了但没生效
按顺序排查:
- 顺序问题 —— 前面有一条更宽泛的规则先命中了。把更具体的规则往上移。
- 被精确映射抢先 —— 同名标题已存在精确映射时,精确映射优先级更高(见 匹配优先级)。
- 表达式语法错误 —— 查看日志里有没有「正则编译失败」;用测试面板验证。
- 限定季度填错 —— 填了季度的规则只对该季生效,换成你要的季或留空。
- 被屏蔽关键词拦下 —— 但注意:命中映射的标题会豁免屏蔽词,所以这条通常不是原因。
命中太多,误伤了别的番
几乎总是因为没有锚定首尾。检查:
- 开头加
^、结尾加$(如果确实要求整串匹配); - 把
.*收紧成更具体的模式; - 确认没有把兜底规则放在太靠前的位置。
想匹配「第 2 季」但季号写法太多
改用**「限定季度」**字段来限定季数,正则只负责匹配作品名。这比在正则里穷举各种季号写法可靠得多。
手改 JSON
正则规则也可以直接写在 bangumi_mapping.json 的 rules 数组里:
json
{
"rules": [
{
"pattern": "^.*之刃$",
"subject_id": "123456",
"description": "鬼灭之刃系列"
},
{
"pattern": "^某番剧",
"subject_id": "789012",
"season": 2,
"description": "仅第 2 季"
}
]
}| 字段 | 必填 | 含义 |
|---|---|---|
pattern | ✅ | 正则表达式(Python 语法) |
subject_id | ✅ | 命中后使用的 Bangumi 条目 ID |
description | 备注,会显示在命中理由中 | |
season | 限定季度;省略表示对所有季生效 |
数组顺序即优先级:靠前的先尝试。
