JavaScript分割多个分隔符并保留分隔符

9

有没有比我现在用正则表达式更好的方法来转换

"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;
}

1
这个问题被踩的原因是什么,我很好奇? - natecraft1
5
可能是因为你没有展示出解决自己问题的努力。 - SomeKittens
1
我加了我的解决方案,尽管我不喜欢它。如果我缺少的是尝试,那么请问能否取消这些踩?=/ - natecraft1
1
我无法删除负评,但我会点赞以补偿。 - SomeKittens
3个回答

9
为什么不像这样做?
'div#container.blue'.split(/(?=[#.])/);

因为它只是在寻找下一个字符是#或字面上的.的位置,所以它没有捕获任何内容,这使它成为零长度匹配。因为它是零长度匹配,所以不会删除任何内容。


我知道有比我的更好的正则表达式。+1 - SomeKittens
2
有没有办法让分割符号带到后面的(而不是下一个)单词? - tslater

3

你可能已经发现,问题在于split会删除你要拆分的项。你可以通过使用正则表达式捕获组(即括号)来解决这个问题:

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

现在我们遇到了一个问题,即result包含许多您不想要的 falsy 值。 一个快速的filter可以解决这个问题:

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

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

我假设您只关心 #. 作为字符。这给了我们这个怪兽:/(#[^#|^.]*)|(\.[^#|^.]*)/

这意味着我们将捕获一个 #.,然后捕获到下一个 #. 的所有字符(记住正则表达式中点号是特殊字符,所以在括号内需要转义)。


1
我为您编写了一个脚本类型的扩展。它允许您选择要使用哪些分隔符,并将其作为字符串传递:
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('#.'));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接