Як підрахувати кількість рядків рядка в javascript


84

Я хочу порахувати кількість рядків у рядку

я спробував використати цю відповідь 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'.

будь-яка ідея, як змусити це працювати?


3
@BookOfZeus "\ n" та "\ r" обробляються його регулярним виразом. "\ n \ r" просто невірно.
bezmax

о, я бачу, ти маєш рацію, поганий
Книга Зевса

Я відповів на відповідне запитання: "Який найшвидший спосіб перевірити мінімальну кількість рядків або жетонів?" stackoverflow.com/questions/39554154/…
Джо Лапп,

@bezmax "\ n \ r" необхідний для вставленого тексту.
Верховний дельфін

@SupremeDolphin Ні, це не так, принаймні не для наведеного прикладу. Див. En.wikipedia.org/wiki/… : "Рядок запиту та інші поля заголовка повинні закінчуватися <CR> <LF>", тобто \r\n.
bezmax

Відповіді:


141

Використовуючи регулярний вираз, ви можете порахувати кількість рядків як

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

Ви також можете спробувати метод розділення, як показано нижче.

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

робоче рішення: http://jsfiddle.net/C8CaX/


2
Збій для цього тесту: 'Roomy Below:\n\nStart again.'. Він виявляє 3 рядки, коли візуально їх існує 4. Це пояснюється тим, що розділення об’єднує обидва нові рядки разом.
SimplGy

4
@SimplGy Що? Це не підводить. Він виявляє 3 рядки, оскільки є 3 рядки, навіть візуально. console.log('Roomy Below:\n\nStart again.')дає вам 3 рядки. Якщо розділити об’єднані нові рядки, це не буде працювати:, console.log('Roomy Below:\n\nStart again.'.split('\n').join('\n'))але це так, і ви знову отримаєте ті самі 3 рядки.
Jools

1
Ви маєте рацію, Jools, я переплутав цей випадок відтворення, оскільки візуально це 3 рядки (перший \ n закінчує текстовий рядок, а другий створює порожній рядок). Я впевнений, що в якийсь момент моє заперечення базувалося на реальному життєвому сценарії, але я не маю уявлення, що саме на даний момент.
SimplGy

4
Якщо текст займає «\ п» для символів нового рядка (наприклад, <textarea>«и value), ви можете розглянути можливість використання TEXT.match(/^/mg).length.
Константин Ван

ви відповіли неправильно, розгляньте випадок "\ n \ n". Є всього два рядки. Але ваш код видає 3. Що неправильно.
Хамідулла

45

Ще одним коротким, потенційно більш продуктивним, ніж роздільне рішення, є:

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

це набагато краще рішення
asmmahmud

3
як це рішення, невелике вдосконалення: \r?насправді нічого не робить, (str.match(/\n/g) || '').lengthдає той самий результат, чи не так?
Самуель Кіршнер

Краще рішення, оскільки функція розбиття створює новий масив, важчий за це рішення.
hashed_name

обидва методи створюють новий масив ... str.match повертає масив, так само як і розділення ... Метод split повертає масив рядків, але str.match повертає масив об'єктів. Я думаю, що об’єкт займає більше місця в пам’яті, ніж рядок ...
Бруно Депре

Явний переможець в тесті
Mila Nautikus


9

Хм, так ... те, що ти робиш, абсолютно неправильно. Коли ви скажете, str.split("\r\n|\r|\n")він спробує знайти точний рядок "\r\n|\r|\n". Тут ви помиляєтесь. Немає такої події в цілому ряду. Те, що ви насправді хочете, - це те, що запропонував Девід Хедлунд:

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

Причина полягає в тому, що метод split не перетворює рядки в регулярні вирази в JavaScript. Якщо ви хочете використовувати регулярний вираз, використовуйте регулярний вираз.


7

Я зробив тест продуктивності, порівнюючи спліт із регулярним виразом, із рядком та виконуючи це за допомогою циклу for.

Здається, цикл for є найшвидшим.

ПРИМІТКА: цей код "як є" не є корисним для вікон та кінцевих рядків macos, але для порівняння продуктивності повинен бути нормальним.

Розділити рядком:

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


смішно, мій орієнтир говорить, що for-loop найповільніший
Міла Наутікус,

3

Є три варіанти:

Використання jQuery (завантажити з веб-сайту jQuery ) - jquery.com

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

Використання регулярного виразу

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

Або відпочинок a для кожного циклу

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


1

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

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

1
 <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>

це працює в моєму випадку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.