合并.split()和.match()结果

Combining .split() and .match() results

本文关键字:结果 match 合并 split      更新时间:2023-09-26

我正在尝试创建一个包含传递正则表达式和子字符串的字符串子字符串的数组。例如:

['stringpart1', 'match1', 'stringpart2', 'match2', 'stringpart3']

这是我的正则表达式:new RegExp("<('/)?" + tag + ".*?>", "g");

我正在使用一个页面源字符串沿着行:

"<html>'n
    <meta class='a'/>'n
    <meta class='b'/>'n
    <div>'n
        <p>test</p>'n
    </div>'n
</html>"

如果我使用.split(re)的页面源,我得到的值

['<html>'n', undefined, ''n', undefined, ''n', '<div>'n<p>test</p>'n</div>'n</html>]

其中匹配的值为undefined

当我使用.match(re)时,所有匹配的值都按预期返回:

['<meta class='a'/>', '<meta class='b'/>']

是否有一个javascript函数可以生成下面的结果?

['<html>'n', "<meta class='a'/>", ''n', "<meta class='b'/>", ''n', '<div>'n<p>test</p>'n</div>'n</html>]

编辑-我的解决方案是基于编辑前的原始问题。我会修改,但我实际上认为在对问题进行编辑之后,james emanon的答案是正确的,我想到的任何东西都只是对他已有的东西的重复。

根据您所拥有的正则表达式,似乎您希望能够做的是选择一个特定的html标记并搜索该标记的所有出现的内容,然后将开始和结束标记加上内容输出到输出数组中。

有一种方法可以做到这一点:repl。它链接

const text = "<html><div>content</div>><div>content</div></html>";
const tag = "div";
const re = new RegExp("(<"+tag+">)(.*?)(<'/"+tag+">)", "g");
let final = [];
let matches = text.match(re).map((m) => m.replace(/>(.)/, ">@@@$1")
                                         .replace(/'<(?=[^'<]*$)/, "@@@<")
                                         .split("@@@"));
for (let i=0; i<matches.length; i++) {
    for (let j=0; j<matches[i].length; j++) {
        final.push(matches[i][j]);
    }
}
console.log(final);

P1xt的上述解决方案很好。对于一个简短的版本,这个"似乎"工作-这是我做的一个快速工作。我假设未定义的对应于'matches'数组。

var text = "<html>'n<meta class='a'/>'n<meta class='b'/>'n<div>'n<p>test</p>'n</div>'n</html>"
var tag = "meta";
var re = new RegExp("<('/)?" + tag + ".*?>", "gm")
var matches = text.match(re)
text.split(re).reduce( (p,c) => {
   (!c) ? p.push(matches.shift()) : p.push(c);
   return p;
}, [])