Еще один простой, но эффективный метод - многократно использовать 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"]
Наслаждайтесь!