2016-11-26 11 views
6

próbuję włączyć to:Dzielenie ciąg na tablicę n słów

"This is a test this is a test" 

w tym:

["This is a", "test this is", "a test"] 

Próbowałem to:

const re = /\b[\w']+(?:[^\w\n]+[\w']+){0,2}\b/ 
const wordList = sample.split(re) 
console.log(wordList) 

ale masz to:

[ '', 
    ' ', 
    ' '] 

Dlaczego tak jest?

(Zasadą jest, aby podzielić ciąg każdego n słów.)

+0

Jaką regułę należy przestrzegać, aby podzielić ciąg? –

+0

@ A.J Zaktualizowałem pytanie. – alex

+3

'.split()' nie zawiera separatora, więc robi odwrotnie, niż chcesz. Musisz zrobić regularne wyszukiwanie regex (z modyfikatorem 'g' zamiast podziału). – JJJ

Odpowiedz

9

Sposób String#split będzie podzielić ciąg przez dopasowane treści, więc nie będzie to dopasowany ciąg w tablicy wynikowej.

Użyj metody String#match z flagą globalnej (g) na wyrażenie regularne zamiast:

var sample="This is a test this is a test" 
 

 
const re = /\b[\w']+(?:\s+[\w']+){0,2}/g; 
 
const wordList = sample.match(re); 
 
console.log(wordList);

Regex explanation here.

4

kod jest dobry, aby przejść. ale nie z podziałem. split potraktuje to jako ogranicznik. na przykład coś takiego:

var arr = "1, 1, 1, 1"; 
arr.split(',') === [1, 1, 1, 1] ; 
//but 
arr.split(1) === [', ', ', ', ', ', ', ']; 

Zamiast używać match lub exec. jak to

var x = "This is a test this is a test"; 
 
var re = /\b[\w']+(?:[^\w\n]+[\w']+){0,2}\b/g 
 
var y = x.match(re); 
 
console.log(y);

2

jako alternatywne podejście, można podzielić ciąg przez przestrzeń i kawałki łączą się w partii.

function splitByWordCount(str, count) { 
 
    var arr = str.split(' ') 
 
    var r = []; 
 
    while (arr.length) { 
 
    r.push(arr.splice(0, count).join(' ')) 
 
    } 
 
    return r; 
 
} 
 

 
var a = "This is a test this is a test"; 
 
console.log(splitByWordCount(a, 3)) 
 
console.log(splitByWordCount(a, 2))

0

Użyj spacji znak specjalny (\s) i match funkcja zamiast split:

var wordList = sample.text().match(/\s?(?:\w+\s?){1,3}/g); 

Podział przerywa ciąg gdzie mecze regex. Dopasowanie zwraca to, co jest dopasowane.

Sprawdź to fiddle.

2

Można podzielić tak:

var str = 'This is a test this is a test'; 
 
var wrd = str.split(/((?:\w+\s+){1,3})/); 
 
console.log(wrd);

Ale trzeba usunąć puste elementy z tablicy.