在JavaScript中,假设我有一个类似"23+var-5/422*b"
的字符串。
我想拆分这个字符串,以便得到[23,+,var,-,5,/,422,*,b]
。
我想对它进行标记,以便将字符串拆分为3种类型的标记:
[0-9]
。[A-z]
。[-+*/]
。所以基本上,遍历字符串,为每个共享相同类的“字符集”(每个字符包含1个或多个字符),将其转换为令牌。
我可以使用for循环,将每个字符与每个类进行比较,并在每次当前“字符类”更改时手动创建一个标记...这将非常繁琐,并使用许多变量和循环。
有没有人知道更优雅(更简洁)的方式到达那里?
答案 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;
}