Подтвердить что ты не робот

Разделить предложения на ',' и удалить окружающие пространства

У меня есть этот код:

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?

4b9b3361

Ответ 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