javascript - 将多个代码块合并在一起

标签 javascript regex

我正在用 JS 编程。我想使用正则表达式将多个相同的“代码块”合并到一个代码块中。请注意第二个 block 是另一个不同的 block 。

示例数据

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

(我不在乎随机名称是在顶部还是在底部。)

我失败的尝试

  1. /(?<=BEFORE ENTRY[^]*?)END[^]*?BEFORE ENTRY/g替换为 "" (如果 BEFORE ENTRY block 是后续的,则有效)

  2. /(BEFORE ENTRY)([^]*?)(END)/g玩弄\1 , \2, \3 。如果我能以某种方式合并捕获组就会起作用。

编辑@Archer评论:数据类型是output:内的多行字符串.

arr = [{id:"1", output:">>EXAMPLE DATA<<"},...,{id:"n", output:">>Some similar Data<<"}]

最佳答案

编辑:抱歉,我没有看到 perl 标签..我可以删除答案吗?逻辑仍然可以重用..

如果您想使用正则表达式,我会使用第二个更简单的正则表达式,并捕获组。此外,我使用一组键使解决方案变得通用。

请注意,使用replace函数,除了能够控制仅在第一个匹配项中插入结果之外,还可以禁用特殊替换,例如$$ 可能会出现在结果中。

您不必将结果存储在数组中,您可以使用本地变量作为结果。

var codeInput = `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`,
  ending = 'END',
  keys = ['BEFORE ENTRY', 'RANDOM NAME'],
  i, len = keys.length, reg, match, results = {}, inserted;

for(i = 0; i < len; i++){
  //getting all the contents
  reg = new RegExp(keys[i] + '([^]*?)' + ending, 'g');
  while(match = reg.exec(codeInput)){
    if(!results[keys[i]]){
      results[keys[i]] = keys[i];
    }
    results[keys[i]] += match[1];
  }
  //inserting the result: replace the first one by result, remove others
  if(results[keys[i]]){
    results[keys[i]] += ending + '\n';
    inserted = false;
    codeInput = codeInput.replace(reg , function(){
      if(!inserted){
        inserted = true;
        return results[keys[i]];
      }
      return '';
    });
  }
}

document.getElementById('result').innerHTML = codeInput;
<pre id="result"><pre>

关于javascript - 将多个代码块合并在一起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48279125/

相关文章:

javascript - 在正则表达式中使用单个组匹配重复模式

javascript - Leaflet Tag Filter Button and MarkerCluster.LayerSupport Plugins - 集成以在单击时更新集群

javascript - 我的 JS 代码中的 session 开始事件

javascript - 是否可以使用 Javascript 检索 iframe 的*完整* HTML 页面源代码?

javascript - 如何在 html 中保存可拖动的 div 位置

JQUERY——查找包含在 SPAN 中的文本,并将其作为 <LI> 输出到 <UL>

regex - 使用 notepad++ 附加现有字符串

regex - 如何使用部分查询字符串从 Elasticsearch 中获取文档?

php - 仅预替换 H1 图像

javascript - HTML 中的文本无法正确显示