---
title: 章节解析规则
lastUpdated: 2026-06-01
sidebar:
    order: 3
---

TRNovel 在打开本地 `.txt` 小说时，会用一套**目录规则集**自动识别章节标题与分卷（卷/部/篇），生成可折叠的「卷 → 章」目录树。内置规则覆盖绝大多数常见格式；你也可以通过配置文件**自定义规则**以适配特殊排版。

## 内置识别能力

- **章节**：`第N章` / `第N节` / `第N回` / `第N话`，N 支持阿拉伯数字与中文数字（含 `〇 零 两` 及 `壹贰…仟`）。
- **英文章节**：`Chapter N` / `Section N` / `Part N` / `Episode N`。
- **特殊章节**：楔子、引子、序章、序言、前言、后记、尾声、终章、番外、外传、附录等。
- **分卷**：`第N卷` / `第N部` / `第N篇`、`上/中/下卷` 等。
- **抗误报**：标题需独占一行（顶格或仅 ASCII 缩进；全角空格 `　` 缩进视为正文段落）、长度受限、排除「第三部分 / 第三节课」等计数词歧义、忽略以句号结尾的行。

## 自定义规则文件

在配置目录下新建 `~/.novel/toc_rules.json`。该文件存在时，其规则会**追加**到内置默认规则之上；文件缺失或格式错误时，自动回退到内置默认（不影响阅读）。

字段对齐 [Legado](https://github.com/gedoor/legado) 的 `TxtTocRule`，正则采用 [`fancy-regex`](https://docs.rs/fancy-regex) 语法（**支持前后向断言**，可直接粘贴 Legado 社区规则）。

```json
{
  "maxTitleLen": 35,
  "rules": [
    {
      "name": "卷",
      "rule": "^第[0-9一二三四五六七八九十百千]{1,8}卷",
      "isVolume": true,
      "enable": true,
      "example": "第一卷 魔性不改"
    },
    {
      "name": "章/节/回",
      "rule": "^第[0-9〇零一二两三四五六七八九十百千万]{1,12}[章节回话](?:[ 　\\t、，,:：．.\\-—]).{0,30}$",
      "isVolume": false,
      "enable": true,
      "example": "第1章 罗峰"
    },
    {
      "name": "排除:计数词歧义",
      "rule": "^第?[0-9一二三四五六七八九十百千]{1,8}(?:部门|部队|部分|节课|集合)",
      "isExclude": true,
      "enable": true
    }
  ]
}
```

### 字段说明

| 字段 | 类型 | 说明 |
| --- | --- | --- |
| `maxTitleLen` | number | 标题最大字符数，超过视为正文（默认 35）。 |
| `rules[].name` | string | 规则名称（仅展示/调试用）。 |
| `rules[].rule` | string | 正则字符串（`fancy-regex` 语法）。 |
| `rules[].isVolume` | bool | 是否为**卷**规则（卷优先于章匹配）。默认 `false`。 |
| `rules[].isExclude` | bool | 是否为**排除**规则（命中即丢弃该行，优先级最高）。默认 `false`。 |
| `rules[].enable` | bool | 是否启用。默认 `true`。 |
| `rules[].example` | string | 示例标题（可选）。 |
| `rules[].serialNumber` | number | 排序号（可选）。 |

### 提示

- 当存在多条章节规则时，TRNovel 会按「有效命中数」自动择优，能自适应「章 / 节 / 回」等不同计数词的书。
- 写规则时建议**锚定行首** `^`、**限制标题长度**、用**显式数字字符类**而非 `.+`，以降低误报。
- 章节标题约定**独占一行**；正文段落若以全角空格 `　　` 缩进，则不会被误判为标题。
