我有一个字符串和两个令牌数组,按照它们放在字符串中的顺序:
var str = `abc TOKEN_EXPRESSION TOKEN_OPERATOR textTOKEN_EXPRESSIONTOKEN_OPERATOR`;
var expressions = [
'z1',
'f3'
];
var operators = [
'+',
'OR'
];
最后,我希望得到一个包含表达式和运算符标记的数组,以及它们在字符串中出现的顺序的简单文本。所以结果应该是这样的:
['abc ', 'z1', ' ', '+', ' text', 'f3', 'OR']
目前,我的方法是使用字符串,搜索TOKEN_EXPRESSION
或TOKEN_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 :(得分: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 :(得分: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);