Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

split string into array of n words per index

I have a string that I'd like to split in an array that has (for example) 3 words per index. What I'd also like it to do is if it encounters a new line character in that string that it will "skip" the 3 words limit and put that in a new index and start adding words in that new index until it reaches 3 again. example

var text = "this is some text that I'm typing here \n yes I really am"

var array = text.split(magic)

array == ["this is some", "text that I'm", "typing here", "yes I really", "am"]

I've tried looking into regular expressions, but so far I can't really make sense of the syntax that is used in regex.

I have written a way to complicated function that splits my string into lines of 3 by first splitting it into an array of separate words using .split(" "); and then using a loop to add add it per 3 into another array. But with that I can't take the new line character into account.

like image 536
Ramin Afshar Avatar asked Feb 14 '23 00:02

Ramin Afshar


2 Answers

You can try with this pattern:

var result = text.match(/\b[\w']+(?:[^\w\n]+[\w']+){0,2}\b/g);

since the quantifier {0,2} is greedy by default, it will take a value less than 2 (N-1) only if a newline is found (since newlines are not allowed here: [^\w\n]+) or if you are a the end of the string.

like image 67
Casimir et Hippolyte Avatar answered Feb 15 '23 19:02

Casimir et Hippolyte


If you're interested in a regexp solution, it goes like this:

   text.match(/(\S+ \S+ \S+)|(\S+ \S+)(?= *\n|$)|\S+/g)
   // result ["this is some", "text that I'm", "typing here", "yes I really", "am"]

Explanation: match either three space separated words, or two words followed by spaces + newline, or just one word (a "word" being simply a sequence of non-spaces).

For any number of words, try this:

text.match(/((\S+ ){N-1}\S+)|(\S+( \S+)*)(?= *\n|$)|\S+/g)

(replace N-1 with a number).

like image 45
gog Avatar answered Feb 15 '23 19:02

gog