2016-10-03 47 views
2

我有一個字符串,並在順序標記它們被放置在字符串中的兩個陣列中它們的位置的數組:如何組裝令牌,基於在一個字符串

var str = `abc TOKEN_EXPRESSION TOKEN_OPERATOR textTOKEN_EXPRESSIONTOKEN_OPERATOR`; 

var expressions = [ 
    'z1', 
    'f3' 
]; 

var operators = [ 
    '+', 
    'OR' 
]; 

最後,我想按照它們出現在字符串中的順序獲得一個包含表達式和運算符令牌的數組以及簡單文本。所以結果應該看起來像:

['abc ', 'z1', ' ', '+', ' text', 'f3', 'OR'] 

此刻,我的做法是用字符串的工作,搜索要麼TOKEN_EXPRESSIONTOKEN_OPERATOR切串一步步的開始。所以,現在是這樣的:

found remaining string 
-------------------------- 
'abc' 'TOKEN_EXPRESSION TOKEN_OPERATOR textTOKEN_EXPRESSIONTOKEN_OPERATOR' 
'z1' ' TOKEN_OPERATOR textTOKEN_EXPRESSIONTOKEN_OPERATOR' 
' '  'TOKEN_OPERATOR textTOKEN_EXPRESSIONTOKEN_OPERATOR' 
'+'  ' textTOKEN_EXPRESSIONTOKEN_OPERATOR' 

但我覺得有得成爲一個更好的,更容易理解和更有效的方式來做到這一點。有任何想法嗎?

+0

什麼是你的現有代碼的樣子?我討厭建議你已經在做同樣的事情... –

+0

@MikeMcCaughan,這是一個多重循環切割字符串的開始一步一步的步驟 –

回答

2

這可能是更容易使用replace方法及其羣體的標誌特徵:

// Initialize two separate counters 
var exc = 0, opc = 0; 

// Replace each found group with corresponding value 
result = str.replace(/TOKEN_(?:(EXPRESSION)|(OPERATOR))/g, function(match, p1, p2) { 
    return "$$" + (p1 ? expressions[exc++] : operators[opc++]) + "$$" 
}); 

// Split on delimiters 
console.log(result.split("$$").filter(String)) 

輸出:

["abc ", "z1", " ", "+", " text ", "f3", "OR"] 
+1

謝謝,爲什麼你使用非捕獲組?是將(表達式)和((操作))組合在一起嗎? –

+0

是的,沒錯。 @Maximus – revo

1

可能你可以做如下;

var  str = `abc TOKEN_EXPRESSION TOKEN_OPERATOR textTOKEN_EXPRESSIONTOKEN_OPERATOR`, 
 
expressions = ['z1','f3'], 
 
    operators = ['+', 'OR'], 
 
    result = str.split(/TOKEN_(EXPRESSION|OPERATOR)/) 
 
       .reduce((p,c) => (c && (c === "EXPRESSION" ? p.push(expressions.shift()) 
 
                  : c === "OPERATOR" ? p.push(operators.shift()) 
 
                       : p.push(c)), p),[]); 
 
console.log(result);