根据字符标记JavaScript字符串

时间:2015-05-13 18:02:41

标签: javascript parsing

在JavaScript中,假设我有一个类似"23+var-5/422*b"的字符串。

我想拆分这个字符串,以便得到[23,+,var,-,5,/,422,*,b]

我想对它进行标记,以便将字符串拆分为3种类型的标记:

  • 数字文字,[0-9]
  • 字符串文字,[A-z]
  • 操作员字符[-+*/]

所以基本上,遍历字符串,为每个共享相同类的“字符集”(每个字符包含1个或多个字符),将其转换为令牌。

我可以使用for循环,将每个字符与每个类进行比较,并在每次当前“字符类”更改时手动创建一个标记...这将非常繁琐,并使用许多变量和循环。

有没有人知道更优雅(更简洁)的方式到达那里?

2 个答案:

答案 0 :(得分:3)

全局正则表达式match将为您执行此操作:

var str = "23+var-5/422*b";
var arr = str.match(/[0-9]+|[a-zA-Z]+|[-+*/]/g); // notice the creation of one token
                                                 // per operator (even if consecutive)

但是,它只是忽略无效字符而不是错误输出。

答案 1 :(得分:0)

以下是使用Regex进行此操作的方法。显然,如果您使用Underscore.js或CoffeeScript,可以更简化代码。所以这是使用vanilla JS的更长版本:

var s = "23+var-5/422*b"; // your string
var re1 = /[0-9]/; // Regex for numerals
var re2 = /[a-zA-Z]/; // Regex for roman chars
var re3 = /[-+*\/]/; // Regex you wanted for operators
// Helper function, return true if n none-negative
function nonNegative(n) {
    return n >= 0;
}
// helper function: add any none-negative n to array arr
function addNonNegative(n, arr) {
    if (nonNegative(n)) {arr.push(n)};
}
// The main function to split string s
function split(s) {
    var result = []; // The result array, initialized

    // Do while string s is none empty.
    while(s.length > 0) {
        // The order of indices of regex found
        var order = [];
        // search for index or which the regex occurs, then if  that index is none-negative, add it to the 'order' array
        addNonNegative(s.search(re1), order);
        addNonNegative(s.search(re2), order);
        addNonNegative(s.search(re3), order);
        // sort the order array
        order = order.sort(); 
        // variables to slice the string s.
        // start is always 0. Marks the starting index of the   first   matched regex
        var start = order.shift(); 
        // Marks the starting index of the second matched regex
        var end = order.shift(); //  end is the second result in    order
        result.push(s.slice(start, end)); // slice the string s     from    start to end
        // update s so that exclude what was sliced before
        s = s.slice(end);
        // boundary condition: finally when end is null once all    regex   have been pulled, set s = ""
        if (end == null) {s = ""};
    }
    return result;
}