You need to enable JavaScript to run this app. 开发node js解析PDF考试评分方案时,如何编写regEx捕获层级编号内容块
优惠活动
大模型
产品
解决方案
定价
更多

开发node js解析PDF考试评分方案时,如何编写regEx捕获层级编号内容块

PDF评分方案解析的正则适配实现

核心规则匹配逻辑

针对这类带层级括号编号的评分文本,正则需要同时满足两个核心要求:

  1. 精准识别合法的层级编号(兼容(a)、(b)、(i)、(iii)、(a) (iii)这类组合式编号,同时避免把正文里的普通括号内容比如(solid)误判为编号)
  2. 以编号为边界拆分文本块,每个块从当前编号开始,直到下一个同格式编号出现前的所有文本都归属当前块

可直接使用的正则表达式

/((?:\s*\([a-z]\)|\s*\([ivx]+\))+)\s*(.*?)(?=\s+(?:\([a-z]\)|\([ivx]+\))|\s*$)/gis

正则组成说明

  • 第一捕获组(编号匹配部分):
    • (?:\s*\([a-z]\)|\s*\([ivx]+\))+:支持连续组合的编号序列,比如样例中连写的(a) (iii)
    • \s*\([a-z]\):匹配单字母类层级编号,如(a)、(b)
    • \s*\([ivx]+\):匹配小写罗马数字类层级编号,如(i)、(iii)、(iv)
  • 第二捕获组(内容匹配部分):
    • .*?:非贪婪匹配规则,抓取从当前编号结束位置开始的所有文本,不会过度吞掉后续内容
  • 边界断言部分:
    • (?=\s+(?:\([a-z]\)|\([ivx]+\))|\s*$):正向先行定义当前块的结束位置,要么是遇到下一个符合规则的合法编号,要么是整个文本的末尾,不会把下一个编号的内容纳入当前块
  • 匹配标记说明:
    • g:全局匹配所有文本块
    • i:兼容偶尔出现的大写字母/大写罗马数字编号
    • s:允许.匹配换行符,适配多行排版的评分文本

误判规避说明

由于合法编号的括号内仅包含单字母或i/v/x组成的罗马数字,样例中正文出现的(solid)、(water/solution/liquid)这类带多字符普通文本的括号内容,完全不匹配编号的字符规则,不会被误判为拆分边界。

Node.js 端使用示例

// 导入解析得到的PDF文本
const scoreSchemeText = `(a) (iii) Separation of solid
Filter to obtain solid/precipitate
Requires realisation that solid is filtered off.
Solid may be stated within in ‘removal of water’
Removal of water
Dry (solid)
OR Evaporate (water/solution/liquid)
2 ALLOW
Removal of water
Evaporate/ distil water/solution/liquid 
IGNORE ‘distil’ if product OR H2 is distilled
Collection of remaining solid 
Requires realisation that solid remains
IGNORE ‘Leave to crystallise’ (already solid)
(a) (iv) Formula`;

// 初始化拆分逻辑
const blockRegex = /((?:\s*\([a-z]\)|\s*\([ivx]+\))+)\s*(.*?)(?=\s+(?:\([a-z]\)|\([ivx]+\))|\s*$)/gis;
const parsedResult = [];
let match;

while ((match = blockRegex.exec(scoreSchemeText)) !== null) {
  parsedResult.push({
    nodeId: match[1].trim(),
    nodeContent: match[2].trim()
  });
}

/**
 * parsedResult 输出结果:
 * 1. nodeId: "(a) (iii)",nodeContent: 从"Separation of solid"到"(already solid)"的全部评分说明
 * 2. nodeId: "(a) (iv)",nodeContent: "Formula"
 */

后续适配调整提示

  • 如果遇到大写罗马数字的编号格式,仅需将正则中罗马数字的字符类[ivx]修改为[ivxIVX]即可兼容
  • 如果需要支持其他格式的层级编号(比如带圈的数字、大写字母开头的编号),仅需在第一捕获组的匹配规则中新增对应字符的匹配分支,不需要改动边界断言的核心逻辑
  • PDF解析输出的文本如果存在多余行首空格、制表符,正则中内置的\s*已经做了兼容,无需额外预处理

内容的提问来源于stack exchange,提问作者Ace Rimmer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.10 03:45:10