2014-04-04 130 views
1

我需要split一個字符串,但只有最後一次出現separator(可能會出現很多次),我可以做(見下文),但我想創建的動態(從說,用戶輸入),而不是有它在硬編碼正則表達式創建

例如:

var separator= /abc/; 
var stringToSplit = 'ONEabc123TWO45THREEabc67FOUR'; 
var result = stringToSplit.split(/(\abc)(?!.*\abc)/); 
/*['ONEabc123TWO45THREE', 'abc', '67FOUR']*/ 

相反,我願做這樣的:

function make(sep){ 
    ...magic happens here... 
    return superSeparator; 
} 
var separator = make(/abc/); 
var stringToSplit = 'ONEabc123TWO45THREEabc67FOUR'; 
var result = stringToSplit.split(separator); 
/*['ONEabc123TWO45THREE', 'abc', '67FOUR']*/ 

JSfiddle

這是可能的沒有沿所有分隔符拆分它,只是粘在一起,除了最後一起join()

+0

你爲什麼要逃離'了'? – Toto

回答

2

您使用RegExp構造此

var re = new RegExp(pattern, flags); 

因此,例如,

function makeMySeparator(pattern) { 
    if (pattern instanceof RegExp) // if input is a RegExp already 
     pattern = pattern.source; // get the string of it's pattern 
    return new RegExp('(' + pattern + ')(?!.*' + pattern + ')'); 
} 

makeMySeparator('\\abc'); // /(\abc)(?!.*\abc)/ 

記住,你需要逃避反斜槓如果你正在寫字符串文字,否則當它被解釋時它們將消失。

+0

謝謝!雖然,可以使用'/ abc /'作爲參數而不是''abc'嗎?我可以解決它,但前者會使我的代碼更加一致。 – Kvothe

+0

@Kvothe你可以做,但你仍然必須創建一個新的_RegExp_實例,所以它並不能真正爲你節省很多。你可以通過訪問're.source'來獲得_RegExp_的底層模式作爲字符串。我會在 –

0

我認爲你可以做到這一點與原生JS:

function splitOnLastSeparator(separatorToSplit, separator) { 
    var length = separatorToSplit.length, 
    index = separatorToSplit.lastIndexOf(separator); 
    var arr = []; 
    arr.push(separatorToSplit.substr(0, index)); 
    arr.push(separator); 
    arr.push(separatorToSplit.substr(index + separator.length, length)); 
    return arr; 
} 
console.log(splitOnLastSeparator('ONEabc123TWO45THREEabc67FOUR', 'abc')); 
+0

'19'編輯它應該是'index'?但我寧願堅持正則表達式,謝謝。 – Kvothe

+0

是的,一個錯字。謝謝 –