需求:用于解析含多行值的结构化文本为对象的正则表达式
结构化文本解析方案(处理多行地址字段)
原代码存在的问题
你原来的正则只能匹配单行键值对,遇到Address这种多行缩进的字段会直接截断,无法完整捕获地址内容;同时没有区分顶级区块(PAYER/PROVIDER/INSURED)和子字段,导致解析出的对象结构混乱。
解决思路
分层次解析:
- 先匹配出PAYER、PROVIDER、INSURED三个顶级区块
- 针对每个区块的内部结构,分别解析子字段(重点处理多行缩进的Address)
完整实现代码
const text = `PAYER: Con PROVIDER: YAHAN Provider ID: 11544974 INSURED: MICHELEEE WCK Member ID: 134557001 Address: 9 CRESCENT OAK MISRI CITY, TX 174 Birth Date: 05/22/1990`; const parseInsuranceText = (rawText) => { const result = {}; // 匹配顶级区块:捕获区块名称和内部所有内容 const topBlockRegex = /(PAYER|PROVIDER|INSURED):\s*([\s\S]*?)(?=\n\n[A-Z]|$)/g; let blockMatch; while ((blockMatch = topBlockRegex.exec(rawText)) !== null) { const blockKey = blockMatch[1].trim().toLowerCase(); const blockContent = blockMatch[2].trim(); switch (blockKey) { case 'payer': result.payer = blockContent; break; case 'provider': result.provider = { name: blockContent.match(/^([^\n]+)/)[1].trim(), providerId: blockContent.match(/Provider ID:\s*(\d+)/)[1] }; break; case 'insured': result.insured = { name: blockContent.match(/^([^\n]+)/)[1].trim(), memberId: blockContent.match(/Member ID:\s*(\d+)/)[1], // 捕获Address后的所有缩进行,合并为单行 address: blockContent.match(/Address:\s*([\s\S]*?)(?=\n\s*[A-Z])/)[1] .trim() .replace(/\n\s+/g, ' '), birthDate: blockContent.match(/Birth Date:\s*(\d{2}\/\d{2}\/\d{4})/)[1] }; break; } } return result; }; // 执行解析并输出结果 console.log(parseInsuranceText(text));
解析结果示例
{ payer: 'Con', provider: { name: 'YAHAN', providerId: '11544974' }, insured: { name: 'MICHELEEE WCK', memberId: '134557001', address: '9 CRESCENT OAK MISRI CITY, TX 174', birthDate: '05/22/1990' } }
关键细节说明
- 顶级区块正则
/(PAYER|PROVIDER|INSURED):\s*([\s\S]*?)(?=\n\n[A-Z]|$)/g:用[\s\S]*?匹配区块内所有内容,通过正向预查(?=\n\n[A-Z]|$)确保只匹配到下一个顶级区块或文本结尾 - Address字段处理:用
[\s\S]*?捕获所有缩进行,再通过replace(/\n\s+/g, ' ')将多行地址合并为单行(若需保留换行,可改为replace(/\n\s+/g, '\n')) - 每个子字段用精准正则匹配,避免格式变动导致的解析错误
内容的提问来源于stack exchange,提问作者Muhammad Faisal
相关产品推荐
相关产品推荐

