2012-02-22 3 views
8

Мне нужен токенизатор, который задает строку с произвольным пробелом среди слов, создаст массив слов без пустых подстрок.Разделить строку, используя пробелы в Javascript?

Например, если строка:

" I dont know what you mean by glory Alice said." 

Я использую:

str2.split(" ") 

Это также возвращает пустые подстроки:

["", "I", "dont", "know", "what", "you", "mean", "by", "glory", "", "Alice", "said."] 

Как отфильтровать пустые строки из массив?

ответ

15

Вы, вероятно, даже не нужно фильтровать, просто разделить с помощью этого регулярного выражения:

" I dont know what you mean by glory Alice said.".split(/\b\s+/) 
+0

Незаконченного тему: что означает '\ b' в регулярном выражении? –

+3

Соответствует границе слова, например пробелу, символу новой строки, символу пунктуации или концу строки (https://developer.mozilla.org/en/JavaScript/Guide/Regular_Expressions). Не может быть идеальным Regex, но для этого он работает. – Daff

+0

@ Мустафа да, я знаю. Но это просто любопытство. –

7

Вы должны обрезать строку перед использованием раскола.

var str = " I dont know what you mean by glory Alice said." 
var trimmed = str.replace(/^\s+|\s+$/g, ''); 
trimmed = str.split(" ") 
2

Я рекомендую .match:

str.match(/\b\w+\b/g); 

Совпадение слова между границами слова, так что все пространства не совпадают, и, следовательно, не включены в результирующий массив.

+0

Это работает еще лучше: >>> str2 «Шалтай-Болтай презрительно улыбнулся Конечно, нет, пока я не скажу, что я имел в виду theres nice аргумент нокаута! » Использование: str3 = str2.матч (/ \ Ъ \ W + \ Ъ/г); Результаты: >>> str3 [«Шалтай», «Болтай», «улыбался», «презрительно», «из», «курс», «вы», «не», «до», «Я», «сказать», «ты», «я», «означал», «theres», «a», «nice», «knock», «down», «argument», «for», ] Так что w + соответствует также "-" – dokondr

+1

@dokondr: Что вы считаете символами слова? Если это все, кроме пробелов, вы можете просто использовать '[^]' вместо '\ w'. – pimvdb

7
str.match(/\S+/g) 

возвращает список некосмическими последовательностей ["I", "dont", "know", "what", "you", "mean", "by", "glory", "Alice", "said."]

str.match(/\w+/g) 

возвращает список всех слов (отметим, что это включает в себя точку в "сказал."): ["I", "dont", "know", "what", "you", "mean", "by", "glory", "Alice", "said"]

DOCS на match()

+1

Хороший ответ. Для ссылки других, '/ S + /' соответствует группам символов, которые являются ** не ** пробелами, тогда как '/ w + /' соответствует группам символов, которые ** являются ** буквенно-цифровыми + подчеркиваниями. Вот почему символ периода ('.') Совпадает с одним, а не с другим. –

0

Я думаю, что пустая подстрока происходит потому, что есть несколько пробелов, которые вы можете использовать replace() в цикле for для замены нескольких wh ИТО-пространство с одного белым пространством, то разделений(), чтобы разделить программу с использованием одного пустого пространства, как это:

// getting full program from div 
 
var program = document.getElementById("ans").textContent; 
 
//removing multiple spaces 
 
var res = program.replace(" ", " "); 
 
for (i = 0; i <= program.length; i++) { 
 
    var res = res.replace(" ", " "); 
 
} 
 
// spliting each word using space as saperator 
 
var result = res.split(" ");

Смежные вопросы