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

时间:2016-09-18 23:15:00

标签: javascript ecmascript-6

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

['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>]

2 个答案:

答案 0 :(得分:3)

编辑 - 我的解决方案基于编辑前的原始问题。我会修改,但实际上我认为在对问题进行编辑之后,詹姆斯·艾曼的答案就是重点,而我提出的任何内容都只是对他所拥有的东西的重复。

基于你的正则表达式,看起来你正在寻找的是选择一个特定的html标签并搜索你的内容以查找该标签的所有出现,然后输出开始和结束标签以及内容到输出数组。

以下是实现这一目标的一种方法:repl.it link

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);

答案 1 :(得分:2)

上面的P1xt解决方案很好。对于较短的版本,这个似乎“似乎”工作 - 这是我做的快速工作。我假设undefined's对应于'matches'数组。

{{1}}