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?
javascript
string
split
Itzik984
quelle
quelle
\r\n
.Antworten:
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/
quelle
'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.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.<textarea>
'svalue
) verwendet, können Sie die Verwendung in Betracht ziehenTEXT.match(/^/mg).length
.Eine andere kurze, möglicherweise leistungsfähigere als geteilte Lösung ist:
const lines = (str.match(/\n/g) || '').length + 1
quelle
\r?
macht eigentlich nichts,(str.match(/\n/g) || '').length
bringt das gleiche Ergebnis, nicht wahr?Zum Teilen mit einem regulären Ausdruck verwenden
/.../
lines = str.split(/\r\n|\r|\n/);
quelle
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.
quelle
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
quelle
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;
quelle
Hier ist die Arbeitsprobe Geige
Entfernen Sie einfach zusätzliche \ r \ n und "|" von Ihrer reg ex.
quelle
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;
quelle
<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
quelle