是否有比我更好的方法(例如通过正则表达式)转
"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;
}
答案 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;
});
我假设您只关注#
和.
字符。这仍然给了我们这个怪物:/(#[^#|^.]*)|(\.[^#|^.]*)/
这意味着我们会捕获#
或.
,然后捕获所有字符,直到下一个#
或.
(记住一段时间很重要)在正则表达式中,所以我们需要逃避它,除非我们在括号内。)
答案 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('#.'));