Как я могу разделить строку с несколькими разделителями в JavaScript? - PullRequest
427 голосов
/ 16 марта 2009

Как разделить строку с несколькими разделителями в JavaScript? Я пытаюсь разделить запятые и пробелы, но, AFAIK, функция разделения JS поддерживает только один разделитель.

Ответы [ 17 ]

612 голосов
/ 16 марта 2009

Передайте регулярное выражение в качестве параметра:

js> "Hello awesome, world!".split(/[\s,]+/)
Hello,awesome,world!

Отредактировано, чтобы добавить:

Вы можете получить последний элемент, выбрав длину массива минус 1:

>>> bits = "Hello awesome, world!".split(/[\s,]+/)
["Hello", "awesome", "world!"]
>>> bit = bits[bits.length - 1]
"world!"

... и если шаблон не совпадает:

>>> bits = "Hello awesome, world!".split(/foo/)
["Hello awesome, world!"]
>>> bits[bits.length - 1]
"Hello awesome, world!"
162 голосов
/ 16 марта 2009

Вы можете передать регулярное выражение в оператор разделения Javascript . Например:

"1,2 3".split(/,| /) 
["1", "2", "3"]

Или, если вы хотите разрешить нескольким разделителям работать вместе как один:

"1, 2, , 3".split(/(?:,| )+/) 
["1", "2", "3"]

(Вы должны использовать не захватывая (? :) parens, потому что в противном случае он возвращается в результат. Или вы можете быть умным, как Аарон, и использовать класс символов.)

(Примеры проверены в Safari + FF)

41 голосов
/ 02 мая 2016

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

Наслаждайтесь!

14 голосов
/ 01 сентября 2015

Давайте сделаем это просто: (добавьте «[] +» к вашему RegEx означает «1 или более»)

Это означает, что "+" и "{1,}" одинаковы.

var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // note ' and - are kept
12 голосов
/ 04 июля 2013

Хитрый метод:

var s = "dasdnk asd, (naks) :d skldma";
var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
console.log(a);//["dasdnk", "asd", "naks", ":d", "skldma"]
7 голосов
/ 27 августа 2012

Для тех из вас, кто хочет больше настроек в своей функции разделения, я написал рекурсивный алгоритм, который разделяет заданную строку со списком символов для разделения. Я написал это до того, как увидел вышеуказанный пост. Я надеюсь, что это поможет некоторым разочарованным программистам.

splitString = function(string, splitters) {
    var list = [string];
    for(var i=0, len=splitters.length; i<len; i++) {
        traverseList(list, splitters[i], 0);
    }
    return flatten(list);
}

traverseList = function(list, splitter, index) {
    if(list[index]) {
        if((list.constructor !== String) && (list[index].constructor === String))
            (list[index] != list[index].split(splitter)) ? list[index] = list[index].split(splitter) : null;
        (list[index].constructor === Array) ? traverseList(list[index], splitter, 0) : null;
        (list.constructor === Array) ? traverseList(list, splitter, index+1) : null;    
    }
}

flatten = function(arr) {
    return arr.reduce(function(acc, val) {
        return acc.concat(val.constructor === Array ? flatten(val) : val);
    },[]);
}

var stringToSplit = "people and_other/things";
var splitList = [" ", "_", "/"];
splitString(stringToSplit, splitList);

Пример выше возвращает: ["people", "and", "other", "things"]

Примечание: flatten функция взята из Rosetta Code

6 голосов
/ 22 апреля 2014

Вы можете просто объединить все символы, которые хотите использовать в качестве разделителей, по отдельности или вместе в регулярное выражение и передать их в функцию split Например, вы можете написать:

console.log( "dasdnk asd, (naks) :d skldma".split(/[ \(,\)]+/) );

И вывод будет:

["dasdnk", "asd", "naks", ":d", "skldma"]
3 голосов
/ 09 марта 2016

Привет, например, если вы разбили и заменили в строке 7:05:45

var hour = time.replace("PM", "").split(":");

Результат

[ '07', '05', '45' ]
3 голосов
/ 16 марта 2009

Возможно, вам следует выполнить какую-то замену строки, чтобы превратить один разделитель в другой разделитель, чтобы у вас был только один разделитель для обработки в вашем разделении.

1 голос
/ 09 апреля 2019
a = "a=b,c:d"

array = ['=',',',':'];

for(i=0; i< array.length; i++){ a= a.split(array[i]).join(); }

это вернет строку без специального символа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...