You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:24:15