Javascript在多个分隔符处分割,同时保留分隔符

时间:2014-03-01 23:08:28

标签: javascript regex match delimiter

是否有比我更好的方法(例如通过正则表达式)转

"div#container.blue"

进入这个

["div", "#container", ".blue"];

这就是我所拥有的......

var arr = [];
function process(h1, h2) {
    var first = h1.split("#");
    arr.push(first[0]);
    var secondarr = first[1].split(".");
    secondarr[0] = "#" + secondarr[0];
    arr.push(secondarr[0]);
    for (i = 1; i< secondarr.length; i++) {
        arr.push(secondarr[i] = "." + secondarr[i]);
    }
    return arr;
}

3 个答案:

答案 0 :(得分:8)

为什么不是这样的?

'div#container.blue'.split(/(?=[#.])/);

因为它只是在寻找下一个字符为#或文字.的地方,所以这不会捕获任何内容,这使得它成为零长度匹配。因为它是零长度匹配,所以不会删除任何内容。

答案 1 :(得分:3)

正如您可能发现的那样,问题是split删除了您要拆分的项目。您可以使用正则表达式捕获组(括号)来解决这个问题:

var result = 'div#container.blue'.split(/(#[^#|^.]*)|(\.[^#|^.]*)/);

现在我们遇到了result包含许多你不想要的假值的问题。快速filter修复:

var result = 'div#container.blue'.split(/(#[^#|^.]*)|(\.[^#|^.]*)/).filter(function(x) {
  return !!x;
});

附录A:正则表达式是什么

我假设您只关注#.字符。这仍然给了我们这个怪物:/(#[^#|^.]*)|(\.[^#|^.]*)/

这意味着我们会捕获#.,然后捕获所有字符,直到下一个#.(记住一段时间很重要)在正则表达式中,所以我们需要逃避它,除非我们在括号内。)

答案 2 :(得分:1)

我为你编写了Script类型的扩展。它允许您选择要使用的分隔符,并以字符串形式传递它们:

String.prototype.splitEx = function(delimiters) {
    var parts = [];
    var current = '';
    for (var i = 0; i < this.length; i++) {
        if (delimiters.indexOf(this[i]) < 0) current += this[i];
        else {
            parts.push(current);
            current = this[i];
        }
    }
    parts.push(current);
    return parts;
};

var text = 'div#container.blue';

console.log(text.splitEx('#.'));