Разделить предложения на ',' и удалить окружающие пространства
У меня есть этот код:
var r = /(?:^\s*([^\s]*)\s*)(?:,\s*([^\s]*)\s*){0,}$/
var s = " a , b , c "
var m = s.match(r)
m => [" a , b , c ", "a", "c"]
Похоже, что вся строка была сопоставлена, но где "b"
ушло? Я предпочел бы получить:
[" a , b , c ", "a", "b", "c"]
так что я могу сделать m.shift()
с результатом, подобным s.split(',')
, но также с удаленными пробелами.
У меня есть ошибка в регулярном выражении или я неправильно понимаю String.prototype.match
?
Ответы
Ответ 1
так что, наконец, я пошел с /(?=\S)[^,]+?(?=\s*(,|$))/g
, который обеспечивает именно то, что мне нужно: все предложения, разделенные "," без окружающих пространств.
' a, OMG abc b a b, d o WTF foo '.
match( /(?=\S)[^,]+?(?=\s*(,|$))/g )
=> ["a", "OMG abc b a b", "d o WTF foo"]
большое спасибо!
Ответ 2
Здесь довольно просто & простой способ сделать это без необходимости сложного регулярного выражения.
var str = " a , b , c "
var arr = str.split(",").map(function(item) {
return item.trim();
});
//arr = ["a", "b", "c"]
Собственный .map
поддерживается в IE9 и более поздних версиях: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map
Или в ES6+ он становится еще короче:
var arr = str.split(",").map(item => item.trim());
И для завершения, вот он в Typescript с информацией о наборе
var arr: string[] = str.split(",").map((item: string) => item.trim());
Ответ 3
Краткий ответ: используйте m = s.match(/[^ ,]/g);
Ваш RE работает не так, как ожидалось, потому что последняя группа соответствует самому последнему совпадению (= c
). Если вы опустите {1,}$
, возвращаемое совпадение будет " a , b ", "a", "b"
. Короче говоря, ваш RegExp возвращает столько совпадений, сколько указанных групп , если не используется global
флаг /g
. В этом случае возвращенный список содержит ссылки на все подстрочные подстроки.
Чтобы добиться эффекта, используйте:
m = s.replace(/\s*(,|^|$)\s*/g, "$1");
Эта замена заменяет каждую запятую (,
), начало (^
) и end ($
), окруженное пробелами, исходным символом (comma
или ничего).
Если вы хотите получить массив, используйте:
m = s.replace(/^\s+|\s+$/g,"").split(/\s*,\s*/);
Этот RE обрезает строку (удаляет все пробелы в начале и конце, затем разбивает строку на <any whitespace>,<any whitespace>
. Обратите внимание, что символы пробела также включают в себя символы новой строки и вкладки. Если вы хотите придерживаться только пробелов, используйте пробел (
) вместо \s
.
Ответ 4
Вы можете попробовать это без сложных регулярных выражений.
var arr = " a , b , c ".trim().split(/\s*,\s*/);
console.log(arr);
Ответ 5
Вы можете сделать это для своих целей
РЕДАКТИРОВАТЬ: удаление второй замены, как предлагается в комментариях.
s.replace(/^\s*|\s*$/g,'').split(/\s*,\s*/)
Сначала replace
обрезает строку, а затем функция split
разделяется на '\s*,\s*'
. Это дает вывод ["a", "b", "c"]
на входе " a , b , c "
Что касается того, почему ваше регулярное выражение не захватывает 'b', вы повторяете захваченную группу, поэтому захватывается только последнее вхождение. Подробнее об этом здесь http://www.regular-expressions.info/captureall.html