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

Itz*_*984 66 javascript string split

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

我试图使用这个stackoverflow答案:

lines = str.split("\r\n|\r|\n"); 
return  lines.length;
Run Code Online (Sandbox Code Playgroud)

在这个字符串(最初是一个缓冲区):

 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
Run Code Online (Sandbox Code Playgroud)

由于某种原因,我得到了行='1'.

任何想法如何让它工作?

Pav*_*van 117

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

 str.split(/\r\n|\r|\n/).length
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试拆分方法,如下所示.

var lines = $("#ptest").val().split("\n");  
alert(lines.length);
Run Code Online (Sandbox Code Playgroud)

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

  • @SimplGy什么?它不会失败.它检测3条线,因为有3条线,甚至在视觉上.`console.log('Roomy Below:\n \nStart again.')`给你3行.如果拆分合并新行,这将不起作用:`console.log('下面的房间:\n \n再次启动.'.split('\n').join('\n'))`,但它确实如此然后你再次获得相同的3行. (3认同)
  • 这个测试用例失败了:''宽敞的下面:\n \n再次开始.'` 它会检测到3条线,在视觉上有4条线.这是因为拆分将两条新线合并在一起. (2认同)
  • 如果你的文本只对'\n'换行换行符(例如`<textarea>'s`值`),你可以考虑使用`TEXT.match(/ ^/mg).length`. (2认同)

ngr*_*man 24

另一个简短,更高效的解决方案是:

const lines = (str.match(/\n/g) || '').length + 1
Run Code Online (Sandbox Code Playgroud)

  • 像这个解决方案,小改进:`\ r?`实际上没有做任何事情,`(str.match(/ \n/g)||'').length`产生相同的结果,不是吗? (3认同)
  • 两种方法都会创建一个新数组... str.match 返回一个数组,因此 split 也返回一个数组... split 方法返回一个字符串数组,但 str.match 返回一个对象数组。我认为对象比字符串占用更多的内存空间...... (2认同)

Dav*_*und 9

要使用正则表达式进行拆分 /.../

lines = str.split(/\r\n|\r|\n/); 
Run Code Online (Sandbox Code Playgroud)


Aad*_*hah 9

嗯,是的......你所做的是绝对错误的.当你说它str.split("\r\n|\r|\n")会试图找到确切的字符串"\r\n|\r|\n".那就是你错了.在整个字符串中没有这样的出现.你真正想要的是David Hedlund建议的:

lines = str.split(/\r\n|\r|\n/);
return lines.length;
Run Code Online (Sandbox Code Playgroud)

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


jpe*_*lli 5

我进行了性能测试,比较了使用正则表达式,字符串和使用for循环进行的拆分。

似乎for循环是最快的。

注意:此代码“原样”对Windows或macOS终端线都没有用,但可以比较性能。

用字符串分割:

split('\n').length;
Run Code Online (Sandbox Code Playgroud)

用正则表达式拆分:

split(/\n/).length;
Run Code Online (Sandbox Code Playgroud)

拆分用于:

var length = 0;
for(var i = 0; i < sixteen.length; ++i)
  if(sixteen[i] == s)
    length++;
Run Code Online (Sandbox Code Playgroud)

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