JS中使用正则合并多组BEFORE ENTRY代码块的技术求助
合并重复「BEFORE ENTRY...END」块的JavaScript解决方案
看起来你需要把分散的BEFORE ENTRY...END块合并成一个,同时保留那个独立的非目标块。我来帮你搞定这个问题——核心思路是先拆分内容类型,再分别处理后重组。
分步实现方案
1. 单个字符串的处理函数
我们先写一个处理单条字符串的函数,它会:
- 把所有
BEFORE ENTRY块里的内容提取出来合并 - 把剩下的独立内容单独保留
- 最后把两部分组合起来(顺序你可以随便调)
function mergeBeforeEntryBlocks(inputStr) { // 第一步:提取所有BEFORE ENTRY块的内部内容 const beforeEntryMatches = inputStr.match(/BEFORE ENTRY([\s\S]*?)END/g); const mergedContent = beforeEntryMatches ? beforeEntryMatches.map(block => { // 去掉每个块的首尾标记,只留中间内容 return block.replace(/^BEFORE ENTRY|END$/g, '').trim(); }).join(' ') : ''; // 第二步:提取独立的非BEFORE ENTRY内容 const independentContent = inputStr.replace(/BEFORE ENTRY[\s\S]*?END/g, '').trim(); // 第三步:组合结果,自动过滤空内容 const resultParts = []; if (independentContent) resultParts.push(independentContent); if (mergedContent) resultParts.push(`BEFORE ENTRY ${mergedContent} END`); return resultParts.join(' '); }
2. 处理数组中的output字段
针对你提到的数组结构,只需要遍历每个元素,把output字段传入上面的函数即可:
// 示例数组 const arr = [ {id:"1", output:"BEFORE ENTRY Im on the top block END RANDOM NAME HAHA I MAKE A PROBLEM END BEFORE ENTRY some randon strings with also 1 numbers 1 END"}, {id:"2", output:"BEFORE ENTRY more strings very cool END BEFORE ENTRY stringi pizza END"} ]; // 处理数组 const processedArray = arr.map(item => ({ ...item, output: mergeBeforeEntryBlocks(item.output) })); // 查看结果 console.log(processedArray);
正则细节说明
[\s\S]*?:用来匹配任意字符(包括换行),*?是非贪婪模式,确保每个BEFORE ENTRY都对应最近的那个END,不会跨块匹配。replace(/^BEFORE ENTRY|END$/g, ''):精准去掉每个块首尾的标记,只保留中间的有效内容。- 提取独立内容时,用
replace把所有BEFORE ENTRY...END块替换为空,剩下的就是你要保留的独立块。
测试你的示例输入
把你给的原输入丢进函数:
BEFORE ENTRY Im on the top block END RANDOM NAME HAHA I MAKE A PROBLEM END BEFORE ENTRY some randon strings with also 1 numbers 1 END BEFORE ENTRY more strings very cool END BEFORE ENTRY stringi pizza END
得到的输出和你期望的完全一致:
RANDOM NAME HAHA I MAKE A PROBLEM END BEFORE ENTRY Im on the top block some randon strings with also 1 numbers 1 more strings very cool stringi pizza END
为啥你的之前尝试没成功?
- 第一个正则
/(?<=BEFORE ENTRY[^]*?)END[^]*?BEFORE ENTRY/g:只能处理连续的BEFORE块,一旦中间插了独立块就失效,而且没有提取内容的逻辑。 - 第二个正则
/(BEFORE ENTRY)([^]*?)(END)/g:虽然能捕获单个块,但正则本身没法帮你把多个捕获的内容合并到一起,必须配合JavaScript的数组处理来完成合并步骤。
内容的提问来源于stack exchange,提问作者Andre Elrico
相关产品推荐
相关产品推荐

