web-dev-qa-db-fra.com

Comment compter le nombre de lignes d'une chaîne en javascript

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?

65
Itzik984

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/

112
Pavan

Une autre solution courte, potentiellement plus performante que split, est la suivante:

const lines = (str.match(/\n/g) || '').length + 1
23
ngryman

Pour scinder en utilisant une expression rationnelle, utilisez /.../

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

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.

9
Aadit M Shah

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++;

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

5
jperelli

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;
3
Joe

Voici l'échantillon de travail violon

Il suffit de supprimer les\r\n et "|" supplémentaires de votre ex rég.

1
Sandeep G B
 <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

0

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;
0
hashed_name