So zählen Sie die Anzahl der Zeilen einer Zeichenfolge in Javascript

81

Ich möchte die Anzahl der Zeilen in einer Zeichenfolge zählen

Ich habe versucht, diese Stackoverflow-Antwort zu verwenden:

lines = str.split("\r\n|\r|\n"); 
return  lines.length;

auf dieser Zeichenfolge (die ursprünglich ein Puffer war):

 GET / HTTP/1.1
 Host: localhost:8888
 Connection: keep-alive
 Cache-Control: max-age=0
 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_2) AppleWebKit/535.2 (KHTML,like Gecko) Chrome/15.0.874.121 Safari/535.2
 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
 Accept-Encoding: gzip,deflate,sdch
 Accept-Language: en-US,en;q=0.8
 Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3

und aus irgendeinem Grund habe ich Zeilen = '1'.

Hast du eine Idee, wie es funktioniert?

Itzik984
quelle
3
@BookOfZeus "\ n" und "\ r" werden von seinem regulären Ausdruck behandelt. "\ n \ r" ist einfach falsch.
bezmax
Oh, ich sehe es, du hast Recht, mein schlechtes
Buch des Zeus
Ich habe eine verwandte Frage beantwortet: "Was ist der schnellste Weg, um auf eine Mindestanzahl von Zeilen oder Token zu testen?" stackoverflow.com/questions/39554154/…
Joe Lapp
@bezmax "\ n \ r" ist für eingefügten Text erforderlich.
Supreme Dolphin
@SupremeDolphin Nein, ist es nicht, zumindest nicht für das gegebene Beispiel. Siehe en.wikipedia.org/wiki/… : "Die Anforderungszeile und andere Headerfelder müssen jeweils mit <CR> <LF> enden" \r\n.
Bezmax

Antworten:

138

Mit einem regulären Ausdruck können Sie die Anzahl der Zeilen als zählen

 str.split(/\r\n|\r|\n/).length

Alternativ können Sie die Split-Methode wie folgt ausprobieren.

var lines = $("#ptest").val().split("\n");  
alert(lines.length);

Arbeitslösung: http://jsfiddle.net/C8CaX/

Pavan
quelle
2
Schlägt für diesen Testfall fehl : 'Roomy Below:\n\nStart again.'. Es erkennt 3 Zeilen, wenn es visuell 4 gibt. Dies liegt daran, dass durch die Aufteilung beide neuen Zeilen zusammengeführt werden.
Einfach
4
@ SimplGy Was? Es scheitert nicht. Es erkennt 3 Linien, weil es 3 Linien gibt, sogar visuell. console.log('Roomy Below:\n\nStart again.')gibt Ihnen 3 Zeilen. Wenn geteilte neue Zeilen geteilt würden, würde dies nicht funktionieren: console.log('Roomy Below:\n\nStart again.'.split('\n').join('\n'))aber es funktioniert und Sie erhalten wieder die gleichen 3 Zeilen.
Jools
1
Sie haben Recht, Jools, ich habe diesen Fall der Neuerstellung durcheinander gebracht, weil das visuell 3 Zeilen sind (die erste \ n beendet eine Textzeile und die zweite erstellt eine leere Zeile). Ich bin mir sicher, dass mein Einwand irgendwann auf einem realen Szenario beruhte, aber ich habe keine Ahnung, was zu diesem Zeitpunkt passiert.
SimplGy
4
Wenn Ihr Text nur '\ n' für neue Zeilenzeichen (z. B. a <textarea>'s value) verwendet, können Sie die Verwendung in Betracht ziehen TEXT.match(/^/mg).length.
19онстантин Ван
Ihre Antwort ist falsch. Betrachten Sie den Fall "\ n \ n". Es gibt nur zwei Zeilen. Aber Ihr Code gibt 3 aus. Was nicht korrekt ist.
Khamidulla
45

Eine andere kurze, möglicherweise leistungsfähigere als geteilte Lösung ist:

const lines = (str.match(/\n/g) || '').length + 1
ngryman
quelle
Dies ist eine viel bessere Lösung
Asmmahmud
3
wie diese Lösung, kleine Verbesserung: Das \r?macht eigentlich nichts, (str.match(/\n/g) || '').lengthbringt das gleiche Ergebnis, nicht wahr?
Samuel Kirschner
Bessere Lösung, da die Split-Funktion ein neues Array erstellt, das schwerer als diese Lösung ist.
hashed_name
Beide Methoden erstellen ein neues Array. str.match gibt ein Array zurück, ebenso die Aufteilung. Die split-Methode gibt ein Array von Zeichenfolgen zurück, aber str.match gibt ein Array von Objekten zurück. Ich denke, ein Objekt benötigt mehr Speicherplatz als eine Zeichenfolge…
Bruno Desprez
klarer Sieger im Benchmark
Mila Nautikus
9

Zum Teilen mit einem regulären Ausdruck verwenden /.../

lines = str.split(/\r\n|\r|\n/); 
David Hedlund
quelle
9

Hmm ja ... was du tust ist absolut falsch. Wenn Sie sagen str.split("\r\n|\r|\n"), wird versucht, die genaue Zeichenfolge zu finden "\r\n|\r|\n". Da liegst du falsch. Es gibt kein solches Vorkommen in der gesamten Saite. Was Sie wirklich wollen, ist das, was David Hedlund vorgeschlagen hat:

lines = str.split(/\r\n|\r|\n/);
return lines.length;

Der Grund dafür ist, dass die Split-Methode Zeichenfolgen in JavaScript nicht in reguläre Ausdrücke konvertiert. Wenn Sie einen regulären Ausdruck verwenden möchten, verwenden Sie einen regulären Ausdruck.

Aadit M Shah
quelle
7

Ich habe einen Leistungstest durchgeführt, bei dem Split mit Regex, mit einem String und mit einer for-Schleife verglichen wurde.

Es scheint, dass die for-Schleife die schnellste ist.

HINWEIS: Dieser Code "wie er ist" ist weder für Windows noch für Macos nützlich, sollte jedoch in Ordnung sein, um die Leistung zu vergleichen.

Mit String teilen:

split('\n').length;

Mit Regex teilen:

split(/\n/).length;

Teilen mit:

var length = 0;
for(var i = 0; i < sixteen.length; ++i)
  if(sixteen[i] == s)
    length++;

http://jsperf.com/counting-newlines/2

jperelli
quelle
lustig, mein Benchmark sagt, dass For-Loop am langsamsten ist
Mila Nautikus
3

Es gibt drei Möglichkeiten:

Verwenden von jQuery (Download von der jQuery-Website ) - jquery.com

var lines = $("#ptest").val().split("\n");
return lines.length;

Regex verwenden

var lines = str.split(/\r\n|\r|\n/);
return lines.length;

Oder eine Neuerstellung von a für jede Schleife

var length = 0;
for(var i = 0; i < str.length; ++i){
    if(str[i] == '\n') {
        length++;
    }
}
return length;
Joe
quelle
1

Hier ist die Arbeitsprobe Geige

Entfernen Sie einfach zusätzliche \ r \ n und "|" von Ihrer reg ex.

Sandeep GB
quelle
1

Bessere Lösung, da die Funktion str.split ("\ n") ein neues Array von Zeichenfolgen erstellt, die durch "\ n" geteilt werden und schwerer als str.match (/ \ n \ g) sind. str.match (/ \ n \ g) erstellt nur ein Array übereinstimmender Elemente. Welches ist "\ n" in unserem Fall.

var totalLines = (str.match(/\n/g) || '').length + 1;
hashed_name
quelle
0
 <script type="text/javascript">
      var multilinestr = `
        line 1
        line 2
        line 3
        line 4
        line 5
        line 6`;
      totallines = multilinestr.split("\n");
lines = str.split("\n"); 
console.log(lines.length);
</script>

das funktioniert in meinem Fall

Krishna Kumar Jangid
quelle