Як я можу розділити рядок JavaScript на пробіл чи коску?


123

Якщо я спробую

"my, tags are, in here".split(" ,")

Я отримую наступне

[ 'my, tags are, in here' ]

Тоді як я хочу

['my', 'tags', 'are', 'in', 'here']

4
ти не маєш на увазі пробіл чи кома?
KaptajnKold

1
Як пояснення результату, який ви отримуєте: "my, tags are, in here".split(" ,")розділить рядок лише там, де роздільником є ​​пробіл, який супроводжується комою. Ваша рядок не містить цієї послідовності, отже, вона не розділена. "my, tags are, in here".split(", ")із заміненою послідовністю поділу, щонайменше, розділиться ваша початкова рядок на три частини, після кожного кома та пробілу. Якщо вам потрібно п'ять частин, відповіді нижче вказують рядок відповідності як звичайний вираз, що відповідає пробілу або кома.
Йохім Шуленклоппер

Відповіді:


233

String.split Ви також можете прийняти регулярний вираз:

input.split(/[ ,]+/);

Цей конкретний регулярний вираз розбивається на послідовність однієї чи декількох коми чи пробілів, так що, наприклад, кілька послідовних пробілів або послідовність пробілів з комою + пробілами не створюють порожніх елементів у результатах.


22
Про що /,?\s+/?
Бергі

4
@Bergi: Ну, це і суворіше, ніж те, що я пропоную (лише одна кома дозволена спереду), і більш вільне (розділене на всі пробіли), ніж те, про що вимагала ОП. ІМХО було б просто гірше - врахуйте вхід spaces , before commas.
Джон

@Jon: Гаразд, це залежить від потреб ОП. Я б не plenk :-)
Берги

11
+1 Я знаю, що це трохи старе, але навіщо використовувати порожнє місце, а не \s. У мене можуть бути деякі перерви в лінії, і \sвони теж піклуються про них.
iambriansreed

6
ПРИМІТКА FACEPALM: не ставте лапки навколо регулярного виразу. наприклад Не використовуйте input.split("/[ ,]+/)". Залиште цитати ( input.split(//)замість input.split("//")), і у вас буде набагато кращий досвід. Бо як не дивно, це справді, ймовірно, працювало б лише на себе (для створення ["input.split(\"", ")\""]).
cod3monk3y

41

Пропозиція використовувати .split(/[ ,]+/)добре, але з природними пропозиціями рано чи пізно ви отримаєте порожні елементи в масиві. напр ['foo', '', 'bar'].

Що добре, якщо це нормально для вашого випадку використання. Але якщо ви хочете позбутися від порожніх елементів, ви можете зробити:

var str = 'whatever your text is...';
str.split(/[ ,]+/).filter(Boolean);

6
Це дуже розумне використання вбудованих неявних конструкторів - клавіатура моїх комп’ютерів зненацька сьогодні - я відредагую цей коментар пізніше, - але точка викликає булевий характер, як "Boolean ()" побудує новий екземпляр [object Boolean] з значення false, як і виклик "new Boolean ()". Це відфільтрує всі збіги до цієї поведінки за замовчуванням. Хороший :)
VLostBoy

що саме ви маєте на увазі під «природними реченнями»? Я не міг наслідувати це, і не розумію, що це має робити.
Крегокс

Це пояснив @VLostBoy. Коли Boolean()конструктор викликає будь-яке значення, він передає це значення булевим - істинним або хибним. Таким чином, будь-які хибні значення будуть відфільтровані з масиву, включаючи порожні рядки.
jonschlinkert

1
btw, ви можете використовувати неявні конструктори для інших подібних цікавих речей, наприклад[1, 2, 3].map(String)
jonschlinkert

2
"foo, bar,,foobar,".split(/[\s,]+/)повертається ["foo", "bar", "foobar", ""](через звисаючу кому в кінці), дякую!
Rafał

37

ви можете використовувати регулярний вираз, щоб захопити будь-яку довжину пробілу, і це буде так:

var text = "hoi how     are          you";
var arr = text.split(/\s+/);

console.log(arr) // will result : ["hoi", "how", "are", "you"]

console.log(arr[2]) // will result : "are" 

Слідкуйте за тим, щоб використовувати провідні / відсталі пробіли під час використання /\s+/. Наприклад, 'a b c '.split(/\s+/) === [ 'a', 'b', 'c', '' ]. Якщо ви .trim()спочатку струни, вам буде добре.
Джордан Додсон


4

input.split(/\s*[\s,]\s*/)

\s*Відповідає нулю або більше символів пробілу (не лише пробіли, але й вкладки та нові рядки).

... [\s,]відповідає одному символу пробілу або одній комеї

Якщо ви хочете уникати пустих елементів, таких як введення "foo,bar,,foobar", це зробить фокус:

input.split(/(\s*,?\s*)+/)

+Відповідає одному або більше з попереднього символу або групи.

Редагувати:

Додано ?після коми, яка відповідає нулю або одній комі.

Редагувати 2:

Виявилося, що редагування 1 було помилкою. Виправлено це. Тепер для виразу має бути хоча б одна кома або один пробіл для виразу.


Ні. Це не добре. Це вихід: ["мій", "теги є", "тут"]
gabitzish

вона ніби розбивається на кожного персонажа.
Марко

@Marco На жаль Напевно, слід було перевірити це, перш ніж я зробив цю останню редакцію. У мене зараз, і цього разу це справді повинно працювати.
KaptajnKold

Хм, як це краще, ніж прийнята відповідь? "foo,bar,foobar".split(/[ ,]+/)повертається ["foo", "bar", "foobar"]також.
Rafał

1
@KaptajnKold О, я цього не зрозумів, дякую за відповідь!
Rafał

2

Коли я хочу врахувати додаткові символи, такі як ваші коми (в моєму випадку кожен маркер може бути введений лапками), я б зробив string.replace (), щоб змінити інші роздільники на пробіли, а потім розділити на пробіл.


1
str_variable.replace(/[,'"]+/gi, ' ').split(' ')
qräbnö
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.