【问题标题】:How to count the number of lines of a string in javascript如何在javascript中计算字符串的行数
【发布时间】:2012-01-19 07:08:46
【问题描述】:

我想统计一个字符串的行数

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

知道如何让它工作吗?

【问题讨论】:

  • @BookOfZeus "\n" 和 "\r" 由他的正则表达式处理。 "\n\r" 是完全错误的。
  • 哦,我明白了,你是对的,我的错
  • 我已经回答了一个相关问题,“测试最少行数或标记的最快方法是什么?” stackoverflow.com/questions/39554154/…
  • @bezmax "\n\r" 是粘贴文本所必需的。
  • @SupremeDolphin 不,它不是,至少对于给出的例子来说不是。见en.wikipedia.org/wiki/…:“请求行和其他头域必须以结尾”,即\r\n

标签: javascript string split


【解决方案1】:

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

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

您也可以尝试以下拆分方法。

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

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

【讨论】:

  • 此测试用例失败:'Roomy Below:\n\nStart again.'。它检测到 3 行,而在视觉上,有 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,我搞砸了这个重新创建案例,因为在视觉上这是 3 行(第一个 \n 结束一个文本行,第二个创建一个空白行)。我确信我的反对意见是基于某个现实生活场景,但我现在不知道是什么。
  • 如果你的文本只使用'\n'作为换行符(例如<textarea>value),你可以考虑使用TEXT.match(/^/mg).length
  • @Khamidulla 你记错了,"\n\n" 有 3 行,每行包含一个空字符串。每个字符串(甚至是空字符串)都有 1 行,然后每个 \n 添加另一行。这与查看“1\n2\n3”实际上是一回事,即数字 1、2 和 3,每一个都在自己的行中。
【解决方案2】:

这是工作示例fiddle

只需删除额外的 \r\n 和“|”从你的注册前。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        共有三个选项:

        使用jQuery(从jQuery website下载)-jquery.com

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

        使用正则表达式

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

        或者,一个 for each 循环的再创造

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

        【讨论】:

        • 这不是一个真实的评论。不只是三个选项。
        【解决方案6】:

        我做了一个性能测试,比较 split 与正则表达式、字符串和 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

        【讨论】:

        • 搞笑,我的benchmark 说for循环最慢
        【解决方案7】:

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

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

        【讨论】:

        • 这是更好的解决方案
        • 像这个解决方案,小改进:\r? 实际上没有做任何事情,(str.match(/\n/g) || '').length 产生相同的结果,不是吗?
        • 更好的解决方案,因为 split 函数会创建比此解决方案重的新数组。
        • 这两种方法都创建了一个新数组...... str.match 返回一个数组,拆分也一样...... split 方法返回一个字符串数组,但 str.match 返回一个对象数组。我认为一个对象在内存中占用的空间比字符串多……
        • benchmark 中的明显赢家
        【解决方案8】:

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

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

        【讨论】:

          【解决方案9】:
           <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】:

            我正在测试函数的速度,我发现我写的这个解决方案比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")

            【讨论】:

              【解决方案11】:

              使用展开运算符且不使用正则表达式的另一种解决方案是:

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

              【讨论】:

                猜你喜欢
                • 2019-11-14
                • 2015-03-31
                • 2016-02-06
                • 1970-01-01
                • 2012-06-26
                • 2023-01-10
                • 1970-01-01
                • 2021-10-25
                • 1970-01-01
                相关资源
                最近更新 更多