2014-03-01 42 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('#.')); 
相關問題