web-dev-qa-db-fra.com

JS regex à scinder par ligne

Comment diviser un long morceau de texte en plusieurs lignes? Pourquoi ce retour line1 deux fois?

/^(.*?)$/mg.exec('line1\r\nline2\r\n');

["line1", "line1"]

J'ai activé le modificateur multiligne pour faire ^ et $ fait correspondre le début et la fin des lignes. J'ai également activé le modificateur global pour capturer les lignes toutes.

Je souhaite utiliser un regex split et non String.split _ parce que je vais traiter à la fois Linux \n et Windows \r\n fins de lignes.

65
JoJo
arrayOfLines = lineString.match(/[^\r\n]+/g);

Comme Tim l'a dit, c'est à la fois le match et la capture. Il semble que regex.exec(string) retourne lors de la recherche de la première correspondance, quel que soit le modificateur global, alors que string.match(regex) respecte la règle globale.

125
ReactiveRaven

Utilisation

result = subject.split(/\r?\n/);

Votre regex retourne line1 deux fois parce que line1 est à la fois la correspondance entière et le contenu du premier groupe de capture.

90
Tim Pietzcker

Je suppose que ce qui suit constitue une nouvelle ligne

  1. \ r suivi de\n
  2. \ n suivi de\r
  3. \ n présent seul
  4. présent seul

Veuillez utiliser

var re=/\r\n|\n\r|\n|\r/g;

arrayofLines=lineString.replace(re,"\n").split("\n");

pour un tableau de toutes les lignes, y compris les lignes vides.

OU

Veuillez utiliser

arrayOfLines = lineString.match(/[^\r\n]+/g); 

Pour un tableau de lignes non vides

22
Arup Hore

Encore plus simple regex qui gère toutes les combinaisons de fin de ligne, même mélangés dans le même fichier, et supprime également les lignes vides:

var lines = text.split(/[\r\n]+/g);

Avec la découpe d'espaces:

var lines = text.trim().split(/\s*[\r\n]+\s*/g);

19
ciscoheat

Tout d'abord remplacer tous les \r\n avec \n, alorsString.split.

7
Tim

http://jsfiddle.net/uq55en5o/

var lines = text.match(/^.*((\r\n|\n|\r)|$)/gm);

J'ai fait quelque chose comme ça. Le lien ci-dessus est mon violon.

0
Abhijit_Srikumar