如何用JavaScript正则解析起止标识间的可变字符串-数字配对?
解决方案
方案1:基于你已去除换行的字符串(正则解析)
首先提取Amount到End之间的核心内容,再循环匹配每一组捐赠名称和金额:
// 你处理后的目标字符串 const body = "DonationAmountRed Cross1,630.83Humanity First500.00Global Health100.00End"; // 1. 捕获Amount与End之间的核心内容 const coreMatch = body.match(/Amount(.*?)End/); if (!coreMatch) { console.log("未找到目标区段"); } const coreContent = coreMatch[1]; // 2. 定义匹配单组捐赠-金额的正则(非贪婪匹配避免跨组) const pairRegex = /([a-zA-Z\s]+?)(\d{1,3}(?:,\d{3})*\.\d{2})/g; // 3. 循环匹配所有组,生成结果数组 const donationPairs = []; let match; while ((match = pairRegex.exec(coreContent)) !== null) { donationPairs.push({ donation: match[1].trim(), amount: match[2] }); } console.log(donationPairs); // 输出: // [ // { donation: "Red Cross", amount: "1,630.83" }, // { donation: "Humanity First", amount: "500.00" }, // { donation: "Global Health", amount: "100.00" } // ]
正则说明:
([a-zA-Z\s]+?):非贪婪匹配字母与空格,确保只捕获到下一个金额前的捐赠名称(\d{1,3}(?:,\d{3})*\.\d{2}):匹配带千分位逗号、保留两位小数的标准金额格式
方案2:保留换行符(更可靠的解法)
你之前去除换行符的操作反而增加了解析难度,原数据的换行是天然分隔符,直接基于行分割处理容错性更高(避免捐赠名称含数字等特殊情况导致正则失效):
// 原始未去除换行的字符串 const rawBody = `Donation Amount Red Cross 1,630.83 Humanity First 500.00 Global Health 100.00 End`; // 1. 按换行分割,过滤空行与空白行 const lines = rawBody.split(/\r?\n/).map(line => line.trim()).filter(line => line); // 2. 定位目标区段的起始与结束索引 const startIdx = lines.indexOf("Amount") + 1; const endIdx = lines.indexOf("End"); // 3. 两两分组生成捐赠-金额配对 const donationPairs = []; for (let i = startIdx; i < endIdx; i += 2) { if (i + 1 < endIdx) { donationPairs.push({ donation: lines[i], amount: lines[i + 1] }); } } console.log(donationPairs); // 输出与方案1一致
优势:不依赖正则对文本格式的强假设,即使捐赠名称包含数字(如"Save Kids 2024")也能正确解析,稳定性更强。
内容的提问来源于stack exchange,提问作者messagevector
相关产品推荐
相关产品推荐

