另一种简单但有效的方法是重复使用split + join。
"a=b,c:d".split('=').join(',').split(':').join(',').split(',')
本质上,先进行拆分,然后再进行连接就像全局替换,所以这会用逗号替换每个分隔符,然后一旦全部替换,它就会在逗号上进行最终拆分
上面表达式的结果是:
['a', 'b', 'c', 'd']
对此进行扩展,您还可以将其放在一个函数中:
function splitMulti(str, tokens){
var tempChar = tokens[0]; // We can use the first token as a temporary join character
for(var i = 1; i < tokens.length; i++){
str = str.split(tokens[i]).join(tempChar);
}
str = str.split(tempChar);
return str;
}
用法:
splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]
如果您经常使用此功能,甚至可能值得考虑包装 String.prototype.split 为方便起见(我认为我的功能相当安全 - 唯一需要考虑的是条件的额外开销(次要)以及它缺少的事实如果传递了数组,则限制参数的实现。
如果使用下面的这种方法简单地包装它,请确保包含splitMulti 函数:)。另外值得注意的是,有些人不赞成扩展内置插件(因为很多人做错了并且可能发生冲突),所以如果有疑问,请在使用此插件之前与更资深的人交谈或询问 SO :)
var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
String.prototype.split = function (){
if(arguments[0].length > 0){
if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
return splitMulti(this, arguments[0]); // Call splitMulti
}
}
return splitOrig.apply(this, arguments); // Call original split maintaining context
};
用法:
var a = "a=b,c:d";
a.split(['=', ',', ':']); // ["a", "b", "c", "d"]
// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
a.split('='); // ["a", "b,c:d"]
享受吧!