Wie teilt man ein langes Stück Text in separate Zeilen auf? Warum gibt diese Zeile1 zweimal zurück?
/^(.*?)$/mg.exec('line1\r\nline2\r\n');
["line1", "line1"]
Ich habe den mehrzeiligen Modifikator aktiviert, um Anfang und Ende von Zeilen zu erstellen ^
und $
abzugleichen. Ich habe auch den globalen Modifikator aktiviert, um alle Zeilen zu erfassen .
Ich möchte einen Regex-Split verwenden und nicht, String.split
weil ich mich sowohl mit Linux- \n
als auch mit Windows- \r\n
Zeilenenden befassen werde .
javascript
regex
newline
JoJo
quelle
quelle
exec
Rückkehr bei der ersten Übereinstimmung darin besteht, dass sie für globale Regexe mehrmals aufgerufen werden soll, bis sie null zurückgibt, und die Regex Dinge wielastIndex
den Index speichert, bei dem die nächste beginnen soll Spiel."123\n\n1234".match(/[^\r\n]+/g);
erwartetArray [ "123", "", "1234" ]
, aber Sie habenArray [ "123", "1234" ]
Verwenden
result = subject.split(/\r?\n/);
Ihre Regex wird
line1
zweimal zurückgegeben, daline1
sowohl die gesamte Übereinstimmung als auch der Inhalt der ersten Erfassungsgruppe angezeigt werden.quelle
g
Flagge verwenden und\r
ist auf einigen alten Apple-Maschinen eine gültige neue Zeile. Auch Unicode definiert\u2028
,\u2029
und die alte IBM Newline\u0085
als Zeilenumbrüche. So/[\n\u0085\u2028\u2029]|\r\n?/g
kümmert sich um alle Grenzfälle./g
Flagge sicher ? Es ist nicht sinnvoll, eine Teilungsfunktion zu haben, die nur einmal geteilt wird, sofern nicht ausdrücklich anders angegeben. Und Jojo sagte, dass er nur mit Linux und Windows zu tun hat. Was kommt als nächstes, EBCDIC?/g
Flagge ist nicht erforderlich. Sie können es hinzufügen, aber JavaScript ignoriert es einfach. Wie Tim sagte, besteht das Standardverhalten darin, so oft wie möglich zu teilen, aber Sie können das zweite Argument verwenden, um ein Maximum festzulegen.(\r\n|[\n\v\f\r\x85\u2028\u2029])
, egal auf welcher Plattform die Software ausgeführt wird oder woher die Daten stammen.g
Flag steuert, ob Erfassungsgruppen in der Ausgabe enthalten sind.Ich gehe davon aus, dass das Folgende Zeilenumbrüche darstellt
Bitte verwende
var re=/\r\n|\n\r|\n|\r/g; arrayofLines=lineString.replace(re,"\n").split("\n");
für ein Array aller Zeilen einschließlich der leeren.
ODER
Bitte verwende
arrayOfLines = lineString.match(/[^\r\n]+/g);
Für ein Array nicht leerer Zeilen
quelle
\n
gefolgt von\r
ist kein einziger ZeilenumbruchNoch einfacher Regex, der alle Zeilenendkombinationen verarbeitet, auch in derselben Datei gemischt, und auch leere Zeilen entfernt:
var lines = text.split(/[\r\n]+/g);
Mit Leerzeichen:
var lines = text.trim().split(/\s*[\r\n]+\s*/g);
quelle
Ersetzen Sie zuerst alle
\r\n
durch\n
, dannString.split
.quelle
myString.replace(/\r\n/, "\n").split("\n")
(es sei denn, Sie fragen wegen akademischen Interesses :))'line1\r\nline2\r\n'.replace(/\r\n/, '\n').split('\n').without('');
erzeugt eine falsche zweite Zelle:["line1", "line2\r"]
/g
Flagge für global vergessen ! Es sollte sein:myString.replace(/\r\n/g, "\n").split("\n")
replace
ist ein regulärer Ausdruck.http://jsfiddle.net/uq55en5o/
var lines = text.match(/^.*((\r\n|\n|\r)|$)/gm);
Ich habe so etwas gemacht. Über dem Link ist meine Geige.
quelle