Как посчитать количество строк строки в JavaScript - PullRequest
63 голосов
/ 13 декабря 2011

Я хочу посчитать количество строк в строке

Я пытался использовать этот ответ stackoverflow:

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

в этой строке (которая изначально была буфером):

 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

и по какой-то причине я получил строки = '1'.

есть идеи, как заставить это работать?

Ответы [ 8 ]

110 голосов
/ 13 декабря 2011

Используя регулярное выражение, вы можете посчитать количество строк как

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

Также вы можете попробовать метод разделения, как показано ниже.

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

рабочий раствор: http://jsfiddle.net/C8CaX/

23 голосов
/ 06 мая 2017

Еще одно короткое, потенциально более производительное, чем сплит, решение:

const lines = (str.match(/\n/g) || '').length + 1
9 голосов
/ 13 декабря 2011

Чтобы разделить с помощью регулярного выражения, используйте /.../

lines = str.split(/\r\n|\r|\n/); 
8 голосов
/ 13 декабря 2011

Хм, да ... то, что вы делаете, абсолютно неправильно. Когда вы говорите str.split("\r\n|\r|\n"), он попытается найти точную строку "\r\n|\r|\n". Вот где ты не прав. Там нет такого происшествия во всей строке. То, что вы действительно хотите, это то, что предложил Дэвид Хедлунд:

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

Причина в том, что метод split не преобразует строки в регулярные выражения в JavaScript. Если вы хотите использовать регулярное выражение, используйте регулярное выражение.

4 голосов
/ 13 апреля 2015

Я сделал тест производительности, сравнивая split с регулярным выражением, со строкой и выполняя это с циклом for.

Кажется, что цикл for является самым быстрым.

ПРИМЕЧАНИЕ: этот код«как есть» бесполезно для окон и конечной строки макроса, но должно быть в порядке для сравнения производительности.

Разделение со строкой:

split('\n').length;

Разделение с помощью регулярного выражения:

split(/\n/).length;

Разделить, используя для:

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

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

3 голосов
/ 12 декабря 2013

Существует три варианта:

Использование jQuery (скачать с веб-сайта jQuery ) - jquery.com

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

Использование Regex

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

Или, воссоздание для каждой петли

var length = 0;
for(var i = 0; i < str.length; ++i){
    if(str[i] == '\n') {
        length++;
    }
}
return length;
1 голос
/ 13 декабря 2011

Вот рабочий пример скрипка

Просто удалите дополнительные \ r \ n и "|"от вашего рег экс.

0 голосов
/ 13 мая 2019

Лучшее решение, так как функция str.split ("\ n") создает новый массив строк, разделенных на "\ n", который тяжелее, чем str.match (/ \ n \ g). str.match (/ \ n \ g) создает массив только совпадающих элементов. Что в нашем случае "\ n".

var totalLines = (str.match(/\n/g) || '').length + 1;
...