如何在javascript中计算字符串的行数

IT技术 javascript string split
2021-03-11 17:02:07

我想计算字符串中的行数

我尝试使用这个 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

出于某种原因,我得到了lines='1'。

知道如何使它工作吗?

6个回答

使用正则表达式,您可以将行数计算为

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

或者,您可以尝试如下拆分方法。

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

工作解决方案:http : //jsfiddle.net/C8CaX/

你是对的 Jools,我搞砸了这个重新创建案例,因为在视觉上它是 3 行(第一个 \n 结束一个文本行,第二个创建一个空行)。我确信我的反对意见是基于某个时候的现实生活场景,但我现在不知道是什么。
2021-04-30 17:02:07
@Khamidulla 你算错了,“\n\n”有 3 行,每行包含一个空字符串。每个字符串(甚至是空字符串)都有 1 行,然后每个 \n 添加另一行。这与查看“1\n2\n3”实际上是一样的,它是数字 1、2 和 3,每个都在自己的行上。
2021-04-30 17:02:07
@SimplGy 什么?它不会失败。它检测到 3 条线,因为有 3 条线,即使在视觉上也是如此。console.log('Roomy Below:\n\nStart again.')给你 3 行。如果 split 合并新行,这将不起作用:console.log('Roomy Below:\n\nStart again.'.split('\n').join('\n')),但它确实如此,您将再次获得相同的 3 行。
2021-05-15 17:02:07
此测试用例失败:'Roomy Below:\n\nStart again.'它检测到 3 行,而在视觉上有 4 行。这是因为拆分将两条新行合并在一起。
2021-05-16 17:02:07
如果您的文本仅采用 '\n' 作为换行符(例如 a <textarea>'s value),您可以考虑使用TEXT.match(/^/mg).length.
2021-05-18 17:02:07

另一个简短的,可能比拆分性能更高的解决方案是:

const lines = (str.match(/\n/g) || '').length + 1
更好的解决方案,因为 split 函数创建了比这个解决方案更重的新数组。
2021-04-21 17:02:07
这是更好的解决方案
2021-04-28 17:02:07
基准测试中的明显赢家
2021-04-28 17:02:07
这两种方法都会创建一个新数组…… str.match 返回一个数组,split 也是如此…… split 方法返回一个字符串数组,但 str.match 返回一个对象数组。我认为一个对象比字符串占用更多的内存空间......
2021-04-30 17:02:07
像这个解决方案一样,小的改进:\r?实际上没有做任何事情,(str.match(/\n/g) || '').length产生相同的结果,不是吗?
2021-05-17 17:02:07

使用正则表达式拆分 /.../

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

嗯是的...你在做什么是完全错误的。当你说它str.split("\r\n|\r|\n")会尝试找到确切的字符串"\r\n|\r|\n"那就是你错了。整个字符串中没有这种情况。你真正想要的是 David Hedlund 的建议:

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

原因是 split 方法不会将字符串转换为 JavaScript 中的正则表达式。如果要使用正则表达式,请使用正则表达式。

我做了一个性能测试,将 split 与正则表达式、字符串和 for 循环进行比较。

似乎for循环是最快的。

注意:此代码“按原样”对 windows 或 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 循环是最慢的
2021-05-12 17:02:07