如何根据字符串

时间:2016-10-03 16:21:59

标签: javascript arrays regex

我有一个字符串和两个令牌数组,按照它们放在字符串中的顺序:

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'

但我觉得必须要有更好,更容易理解和更有效的方法。有什么想法吗?

2 个答案:

答案 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);