我正在用 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
(我不在乎随机名称是在顶部还是在底部。)
我失败的尝试
/(?<=BEFORE ENTRY[^]*?)END[^]*?BEFORE ENTRY/g
替换为""
(如果 BEFORE ENTRY block 是后续的,则有效)/(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/