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

时间:2011-12-13 11:49:59

标签: javascript string split

我想计算字符串中的行数

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

任何想法如何让它发挥作用?

11 个答案:

答案 0 :(得分:108)

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

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

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

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

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

答案 1 :(得分:23)

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

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

答案 2 :(得分:9)

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

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

答案 3 :(得分:8)

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

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

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

答案 4 :(得分:4)

我进行了性能测试,将split与regex进行比较,使用字符串并使用for循环进行比较。

似乎for循环是最快的。

注意:此代码'原样是'对于windows或macos endline没用,但是应该可以比较性能。

用字符串分割:

split('\n').length;

使用正则表达式分割:

split(/\n/).length;

使用for分割:

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

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

答案 5 :(得分:3)

有三种选择:

使用jQuery(从jQuery website下载) - 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;

答案 6 :(得分:1)

以下是工作示例fiddle

只需删除其他\ r \ n和“|”来自您的注册表。

答案 7 :(得分:1)

使用扩展运算符且不使用正则表达式来解决此问题的另一种解决方案是:

const lines = [...csv].reduce((a, c) => a + (c === '\n' ? 1 : 0), 0)

const csv = `
demo_budget_2021_v4_wk_9,test,Civil,Spares,test,false,12,2021,100
demo_budget_2021_v4_wk_9,test,Civil,Spares,test,false,11,2021,100
demo_budget_2021_v4_wk_9,test,Civil,Spares,test,false,10,2021,100
demo_budget_2021_v4_wk_9,test,Civil,Spares,test,false,9,2021,100
`

const lines = [...csv].reduce((a, c) => a + (c === '\n' ? 1 : 0), 0)

console.log(lines);

答案 8 :(得分:0)

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

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

答案 9 :(得分:0)

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

在我的情况下有效

答案 10 :(得分:0)

我正在测试函数的速度,我始终发现我编写的这个解决方案比 matching 快得多。与之前的长度相比,我们检查字符串的新长度。

const lines = str.length - str.replace(/\n/g, "").length+1;

let str = `Line1
Line2
Line3`;
console.time("LinesTimer")
console.log("Lines: ",str.length - str.replace(/\n/g, "").length+1);
console.timeEnd("LinesTimer")