2017-09-29 2 views
2

Je suis à la recherche d'une solution pour diviser une chaîne à chaque énième saut de ligne. Disons que j'ai une chaîne qui a six lignesChaîne fractionnée à chaque nième saut de ligne utilisant javascript

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

Donc fractionnement à la rupture 3e ligne me donnerait quelque chose comme

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

J'ai trouvé des solutions pour le faire au nième caractère, mais je On ne peut pas dire à quelle longueur de caractère se produira la onzième rupture. J'espère que ma question est claire. Merci.

+0

Ne pas essayer de diviser, essayer de faire correspondre au moins 3 lignes. –

+0

@CasimiretHippolyte Je ne sais pas très bien comment faire, j'ai trouvé des motifs qui correspondent à plusieurs lignes, ayant du mal à trouver des motifs qui correspondent à n nombre de lignes. –

+1

@HaiderAli Dans ce cas, comment voulez-vous que votre sortie soit lorsque votre entrée est 'One \ n \ n \ n \ n \ nDeux \ n \ nTrois \ n \ nVers \ n \ nVoler \ n \ n \ n \ nSix \ n'? – Gurman

Répondre

2

Au lieu d'utiliser le String.prototype.split, il est plus facile d'utiliser la méthode String.prototype.match:

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

demo

détails du motif:

(?=[\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) 

Autre chemin avec 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; 
}, []); 
1

straight-forward:

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

Voir a demo on regex101.com.


Ventilées, ce dit:

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