如何计算JavaScript中字符串的行数


81

我想计算一个字符串中的行数

我试图使用这个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'。

任何想法如何使其工作?


3
@BookOfZeus“ \ n”和“ \ r”由他的正则表达式处理。“ \ n \ r”是完全错误的。
bezmax 2011年

哦,我明白了,你说得对,我是坏人
宙斯书

我已经回答了一个相关的问题,“测试最小数量的行或标记的最快方法是什么?” stackoverflow.com/questions/39554154/...
乔·拉普

@bezmax“ \ n \ r”对于粘贴的文本是必需的。
至尊海豚

@SupremeDolphin不,不是,至少对于给出的示例而言不是。请参阅en.wikipedia.org/wiki/…:“请求行和其他标头字段均必须以<CR> <LF>结尾”,即\r\n
bezmax

Answers:


137

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

 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.'。它在视觉上只有4条时检测到3条线。这是因为拆分将两条新线合并在一起。
SimplGy 2014年

4
@SimplGy什么?它不会失败。它检测到3条线,因为即使在视觉上也有3条线。console.log('Roomy Below:\n\nStart again.')给你3行。如果split合并了新行,这将不起作用:console.log('Roomy Below:\n\nStart again.'.split('\n').join('\n')),但是可以,并且您再次获得相同的3行。
乔尔斯

1
您是对的Jools,我搞砸了这个重新创建的情况,因为从视觉上看,这是3行(第一个\ n结束文本行,第二个\ n创建空白行)。我确定我的异议有时是基于现实生活中的情况,但目前我还不知道该怎么办。
SimplGy

4
如果您的文字仅使用'\ n'作为换行符(例如<textarea>value),则可以考虑使用TEXT.match(/^/mg).length
КонстантинВан

您的回答不正确,请考虑大小写“ \ n \ n”。只有两行。但是您的代码输出3.这是不正确的。
Khamidulla

42

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

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

这是一种更好的解决方案
asmmahmud

3
像这样的解决方案,有一点点改进:\r?实际上并没有做任何事情,(str.match(/\n/g) || '').length会产生相同的结果,不是吗?
塞缪尔·

更好的解决方案,因为split函数会创建比该解决方案更重的新数组。
hashed_name

这两个方法都创建了一个新数组…str.match返回一个Array,拆分也是如此……split方法返回一个字符串数组,但是str.match返回一个对象数组。我认为一个对象比字符串要占用更多的内存空间……
Bruno Desprez



9

嗯...你在做什么绝对是错的。当您说时str.split("\r\n|\r|\n"),它将尝试查找确切的字符串"\r\n|\r|\n"。那就是你错了。整个字符串中没有这种情况。您真正想要的是David Hedlund建议的内容:

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

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


7

我进行了性能测试,比较了使用正则表达式,字符串和使用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循环最慢
Mila Nautikus

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;

或者,为每个循环重新创建一个

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


0

更好的解决方案,因为str.split(“ \ n”)函数创建了由“ \ n”分割的新字符串数组,该数组比str.match(/ \ n \ g)重。str.match(/ \ n \ g)仅创建匹配元素的数组。在我们的例子中是“ \ n”。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.