7

Как разделить строку с несколькими разделителями в JavaScript?

1

Как разделить строку с несколькими разделителями в JavaScript?

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

5 ответ(ов)

10

Вы можете передать регулярное выражение в качестве параметра в метод split() в JavaScript. Пример использования:

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!"

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

1

Еще один простой, но эффективный метод - это повторное использование split и join.

"a=b,c:d".split('=').join(',').split(':').join(',').split(',')

По сути, выполнение split с последующим join эквивалентно глобальной замене, поэтому каждый разделитель заменяется на запятую, а затем происходит финальное разбиение по запятой.

Результат выражения выше будет:

['a', 'b', 'c', 'd']

Если развить эту идею, вы можете поместить это в функцию:

function splitMulti(str, tokens) {
    var tempChar = tokens[0]; // Используем первый токен как временный разделитель
    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 для удобства (я считаю, что моя функция достаточно безопасна - единственное, что стоит учитывать, это дополнительная накладная overhead от условных операторов (незначительная) и отсутствие реализации аргумента limit, если передан массив).

Не забудьте включить функцию splitMulti, если используете этот подход, поскольку ниже просто происходит ее обертывание 😃. Также стоит отметить, что некоторые люди не одобряют расширение встроенных объектов (так как многие делают это неправильно, и могут возникнуть конфликты), поэтому, если есть сомнения, обсудите это с более опытным коллегой или задайте вопрос на SO 😃

var splitOrig = String.prototype.split; // Сохраняем ссылку на встроенную функцию
String.prototype.split = function () {
    if (arguments[0].length > 0) {
        if (Object.prototype.toString.call(arguments[0]) == "[object Array]") { // Проверяем, является ли разделитель массивом
            return splitMulti(this, arguments[0]);  // Вызываем splitMulti
        }
    }
    return splitOrig.apply(this, arguments); // Вызываем оригинальный split, сохраняя контекст
};

Использование:

var a = "a=b,c:d";
a.split(['=', ',', ':']); // ["a", "b", "c", "d"]

// Проверка, что встроенный split по-прежнему работает (хотя наш обертка не будет работать, если это не так, так как она от этого зависит :P)
a.split('='); // ["a", "b,c:d"] 

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

0

Давайте оставим все просто: (добавление "[ ]+" в ваше регулярное выражение означает "1 или более")

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

var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // примечание: ' и - сохраняются

Этот код разбивает строку text на массив слов, используя регулярное выражение, которое находит один или несколько символов из заданного набора (включая пробелы и знаки препинания) в качестве разделителей. Символы ' и - не обрабатываются как разделители, а остаются в словах.

0

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

  1. Исходная строка: Вы начинаете с строки s, которая содержит текст с символами (, ), и ,.

    var s = "dasdnk asd, (naks) :d skldma";
    
  2. Удаление символов: С помощью метода replace() вы последовательно заменяете символы (, ) и , на пробелы. После этих вызовов ваша строка будет выглядеть так:

    s.replace('(', ' ').replace(')', ' ').replace(',', ' ');
    

    На выходе получится:

    "dasdnk asd   naks  :d skldma"
    

    Обратите внимание, что после замены у вас могут образоваться несколько пробелов подряд.

  3. Разбиение строки на массив: С помощью split(' ') вы разбиваете строку на массив, используя пробел как разделитель.

    var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
    

    Результат будет массивом:

    ["dasdnk", "asd", "naks", ":d", "skldma"]
    
  4. Вывод результата: И наконец, с помощью console.log(a) вы выводите результат в консоль.

Таким образом, ваш код эффективно удаляет указанные символы и разбивает строку на части, что на выходе дает нужный массив. Если хотите избежать пустых строк в массиве из-за нескольких пробелов, можно использовать регулярное выражение в split():

var a = s.replace(/[(),]/g, ' ').split(/\s+/);

Это позволит вам разбить строку по пробелам, игнорируя лишние пробелы.

0

Вот несколько случаев, которые могут быть полезны при использовании регулярных выражений (Regex):

  • \W для поиска любого символа, кроме буквенно-цифровых символов [a-zA-Z0-9_]. Пример:
("Hello World,I-am code").split(/\W+/); // вернет [ 'Hello', 'World', 'I', 'am', 'code' ]
  • \s+ для поиска одного или нескольких пробелов.
  • \d для поиска цифры.
  • Если вы хотите разбить строку по определённым символам, например, , и -, вы можете использовать str.split(/[,-]+/) и так далее.
Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь