2014-03-01 41 views
6

难道还有比我有什么更好的方法(通过正则表达式,例如)打开的Javascript分割在多个delimters同时保持分隔符

"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

为什么这是因为好奇而被低估的? – natecraft1

+5

可能是因为你没有努力解决你自己的问题。 – SomeKittens

+0

我加了我的解决方案,但我讨厌它。如果我错过了这个尝试,我能否取消降价? =/ – natecraft1

回答

7

为什么不这样呢?

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

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

+0

我知道*有比我更好的正则表达式。 +1 – SomeKittens

+1

有没有办法让分割带有分隔符到前进(而不是随后)的单词? – 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('#.')); 
相关问题