Как разделить строку с несколькими разделителями в JavaScript?
Как разделить строку с несколькими разделителями в JavaScript?
Я пытаюсь разделить строку как по запятым, так и по пробелам, но, насколько я знаю, функция split()
в JavaScript поддерживает только один разделитель. Как мне решить эту проблему?
5 ответ(ов)
Вы можете передать регулярное выражение в качестве параметра в метод 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!"
Таким образом, если регулярное выражение не найдет совпадений, вся строка будет считаться единственным элементом массива.
Еще один простой, но эффективный метод - это повторное использование 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"]
Наслаждайтесь!
Давайте оставим все просто: (добавление "[ ]+" в ваше регулярное выражение означает "1 или более")
Это значит, что "+" и "{1,}" эквивалентны.
var words = text.split(/[ .:;?!~,`"&|()<>{}\[\]\r\n/\\]+/); // примечание: ' и - сохраняются
Этот код разбивает строку text
на массив слов, используя регулярное выражение, которое находит один или несколько символов из заданного набора (включая пробелы и знаки препинания) в качестве разделителей. Символы '
и -
не обрабатываются как разделители, а остаются в словах.
Ваш код выполняет несколько операций над строкой, чтобы удалить определённые символы и разбить строку на массив. Давайте разберём его шаг за шагом.
Исходная строка: Вы начинаете с строки
s
, которая содержит текст с символами(
,)
, и,
.var s = "dasdnk asd, (naks) :d skldma";
Удаление символов: С помощью метода
replace()
вы последовательно заменяете символы(
,)
и,
на пробелы. После этих вызовов ваша строка будет выглядеть так:s.replace('(', ' ').replace(')', ' ').replace(',', ' ');
На выходе получится:
"dasdnk asd naks :d skldma"
Обратите внимание, что после замены у вас могут образоваться несколько пробелов подряд.
Разбиение строки на массив: С помощью
split(' ')
вы разбиваете строку на массив, используя пробел как разделитель.var a = s.replace('(',' ').replace(')',' ').replace(',',' ').split(' ');
Результат будет массивом:
["dasdnk", "asd", "naks", ":d", "skldma"]
Вывод результата: И наконец, с помощью
console.log(a)
вы выводите результат в консоль.
Таким образом, ваш код эффективно удаляет указанные символы и разбивает строку на части, что на выходе дает нужный массив. Если хотите избежать пустых строк в массиве из-за нескольких пробелов, можно использовать регулярное выражение в split()
:
var a = s.replace(/[(),]/g, ' ').split(/\s+/);
Это позволит вам разбить строку по пробелам, игнорируя лишние пробелы.
Вот несколько случаев, которые могут быть полезны при использовании регулярных выражений (Regex):
\W
для поиска любого символа, кроме буквенно-цифровых символов[a-zA-Z0-9_]
. Пример:
("Hello World,I-am code").split(/\W+/); // вернет [ 'Hello', 'World', 'I', 'am', 'code' ]
\s+
для поиска одного или нескольких пробелов.\d
для поиска цифры.- Если вы хотите разбить строку по определённым символам, например,
,
и-
, вы можете использоватьstr.split(/[,-]+/)
и так далее.
Как проверить корректность email-адреса в JavaScript?
Как использовать переменную в регулярном выражении?
Проверка соответствия строки регулярному выражению в JS
Разделить массив на части
Как преобразовать строку, разделённую запятыми, в массив?