最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

regex - Split string at every nth linebreak using javascript - Stack Overflow

programmeradmin1浏览0评论

I'm looking for a solution to split a string at every nth linebreak. Lets say i have one string that has six lines

"One\nTwo\nThree\nFour\nFive\nSix\n"

So splitting at 3rd line break would give me something like

"One\nTwo\nThree\n" and "Four\nFive\nSix\n"

I've found solutions to do it at nth character, but i can't be definite of at what character length the nth break would occur. I hope my question is clear. Thanks.

I'm looking for a solution to split a string at every nth linebreak. Lets say i have one string that has six lines

"One\nTwo\nThree\nFour\nFive\nSix\n"

So splitting at 3rd line break would give me something like

"One\nTwo\nThree\n" and "Four\nFive\nSix\n"

I've found solutions to do it at nth character, but i can't be definite of at what character length the nth break would occur. I hope my question is clear. Thanks.

Share Improve this question asked Sep 29, 2017 at 17:48 Haider AliHaider Ali 9642 gold badges12 silver badges27 bronze badges 4
  • Don't try to split, try to match at least 3 lines. – Casimir et Hippolyte Commented Sep 29, 2017 at 17:49
  • @CasimiretHippolyte Not quite sure how to do that, i've found patterns that match multiple lines, having trouble finding patterns that match every n number of lines. – Haider Ali Commented Sep 29, 2017 at 17:52
  • 1 @HaiderAli In this case, How do you want your output to be when your input is One\n\n\n\n\nTwo\n\nThree\n\nFour\n\nFive\n\n\n\nSix\n? – Gurmanjot Singh Commented Sep 29, 2017 at 18:03
  • @Gurman That will not occur, the string is programatically prepared from an array. I'd rather split a string rather paginate an array ;p – Haider Ali Commented Sep 29, 2017 at 18:12
Add a ment  | 

2 Answers 2

Reset to default 4

Instead of using the String.prototype.split, it's easier to use the String.prototype.match method:

"One\nTwo\nThree\nFour\nFive\nSix\n".match(/(?=[\s\S])(?:.*\n?){1,3}/g);

demo

pattern details:

(?=[\s\S]) # ensure there's at least one character (avoid a last empty match)

(?:.*\n?)  # a line (note that the newline is optional to allow the last line)

{1,3} # greedy quantifier between 1 and 3
      # (useful if the number of lines isn't a multiple of 3)

Other way with Array.prototype.reduce:

"One\nTwo\nThree\nFour\nFive\nSix\n".split(/^/m).reduce((a, c, i) => {
    i%3  ?  a[a.length - 1] += c  :  a.push(c);
    return a;
}, []);

Straight-forward:

(?:.+\n?){3}

See a demo on regex101..


Broken down, this says:

(?:  # open non-capturing group
.+   # the whole line
\n?  # a newline character, eventually but greedy
){3} # repeat the group three times
发布评论

评论列表(0)

  1. 暂无评论