Je veux compter le nombre de lignes d'une chaîne
j'ai essayé d'utiliser cette réponse stackoverflow:
lines = str.split("\r\n|\r|\n");
return lines.length;
sur cette chaîne (qui était à l'origine un tampon):
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
et pour une raison quelconque, j'ai eu des lignes = '1'.
aucune idée de comment le faire fonctionner?
En utilisant une expression régulière, vous pouvez compter le nombre de lignes comme
str.split(/\r\n|\r|\n/).length
Alternativement, vous pouvez essayer la méthode split comme ci-dessous.
var lines = $("#ptest").val().split("\n");
alert(lines.length);
solution de travail: http://jsfiddle.net/C8CaX/
Une autre solution courte, potentiellement plus performante que split, est la suivante:
const lines = (str.match(/\n/g) || '').length + 1
Pour scinder en utilisant une expression rationnelle, utilisez /.../
lines = str.split(/\r\n|\r|\n/);
Hmm ouais ... ce que vous faites est absolument faux. Quand vous dites str.split("\r\n|\r|\n")
, il essaiera de trouver la chaîne exacte "\r\n|\r|\n"
. C'est là que tu as tort. Il n'y a pas une telle occurrence dans toute la chaîne. Ce que vous voulez vraiment, c'est ce que David Hedlund a suggéré:
lines = str.split(/\r\n|\r|\n/);
return lines.length;
La raison en est que la méthode split ne convertit pas les chaînes en expressions régulières en JavaScript. Si vous voulez utiliser une expression rationnelle, utilisez une expression rationnelle.
J'ai fait un test de performance comparant split avec regex, avec une chaîne et avec une boucle for.
Il semble que la boucle for soit la plus rapide.
NOTE: ce code "tel quel" n'est pas utile pour windows ni macos endline, mais devrait permettre de comparer les performances.
Split avec ficelle:
split('\n').length;
Split avec regex:
split(/\n/).length;
Fractionner en utilisant pour:
var length = 0;
for(var i = 0; i < sixteen.length; ++i)
if(sixteen[i] == s)
length++;
Il y a trois options:
Utilisation de jQuery (téléchargement de site Web de jQuery ) - jquery.com
var lines = $("#ptest").val().split("\n");
return lines.length;
Utiliser Regex
var lines = str.split(/\r\n|\r|\n/);
return lines.length;
Ou, une recréation d'un pour chaque boucle
var length = 0;
for(var i = 0; i < str.length; ++i){
if(str[i] == '\n') {
length++;
}
}
return length;
Voici l'échantillon de travail violon
Il suffit de supprimer les\r\n et "|" supplémentaires de votre ex rég.
<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>
ça marche dans mon cas
Meilleure solution, car la fonction str.split ("\ n") crée un nouveau tableau de chaînes divisé par "\ n" qui est plus lourd que str.match (/\n\g). str.match (/\n\g) crée un tableau d'éléments correspondants uniquement. Ce qui est "\ n" dans notre cas.
var totalLines = (str.match(/\n/g) || '').length + 1;