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

3

我正在尝试计算字符串中所有空行的数量。目前的函数有点可用:

function count_empty(text) {
    var regex = /\r\n?|\n/g;
    var lines = text.split(regex);
    var sep = [];
    $.each(lines, function(k, val) {
        if(!val) {
            //sentence
            sep.push(val);
        }
    });
    return sep.length;
}

…但我认为可以采用更好的方法来实现,比如这样:

function count_empty(text) {
    return (text.match(/\r\n?|\n/g) || []).length;
}

当然,第二种选择中的正则表达式应该被修改以满足要求。所以问题是:我应该在第二种方法中使用什么正则表达式来仅检索空行?
一个考虑因素:如果一行只包含空格,则它将被视为空行。
这个文本区域的字符串应该通过函数返回3。
<textarea id="test">first line

third line


</textarea>

谢谢!


这个 <textarea id="test"></textarea> 应该是1还是0,即一行必须以 \r?\n 结尾吗?当你说 spaces 时,你是指确切的空格还是任何空白字符? - Xotic750
@Xotic750 你好!在那种情况下计数应该为0,我指的是空格。 - Andres SK
3个回答

5
如果您启用正则表达式的多行模式m,您可以匹配空行^$,并计算找到了多少个匹配项。请注意,[ \t]*将匹配零个或多个空格或制表符。
function count_lines(text){
    return text ? (text.match(/^[ \t]*$/gm) || []).length : 0;
}

由于正则表达式后不需要进行后处理,因此这应该非常快。

请参阅Regex101上带注释的演示。


@andufo,谢谢。看起来\s*量词正在消耗相邻的换行符。我已经根据需要更新了正则表达式。 - Gio Borje
刚刚尝试了很多正则表达式的情况,看起来它的工作效果符合预期。谢谢! - Andres SK
<textarea id="test"></textarea>视为唯一,并仅处理空格和制表符,而不是所有空格。 - Xotic750
@Xotic750 你说得对,忘记测试文本区为空的情况了。 - Andres SK
@Xotic750,您说的“不是所有空格”是什么意思?我尝试了很多空格方案(制表符、空行、空格和组合)https://www.regex101.com/r/yX5pS1/3 - Andres SK
显示剩余6条评论

1
这个怎么样?
function count_empty(text) {
    return (text.match(/(^[ \t]*(\n|$))/gm) || []).length;
}

Fiddle

可以直接翻译为:"

{{链接1:Fiddle}}

",其中保留了HTML标记和占位符。

它没有计算最后一个回车(如果在末尾添加了一个空行)。 - Andres SK
没错,我已经更新了,以防您想尝试其他方法。谢谢 :) - acontell

0

你可以只是这样做

function count_lines(txt){
   return (txt.match(/\n(?=\n/g)) || []).length;
}

上述代码的作用是匹配一个紧跟着另一个 \n\n,并返回匹配的长度。

演示


只有两件事情:1) 我添加了修复返回值的代码,以防止出现js错误:return (text.match(/\n(?=\n)/g) || []).length;2) 由于某种原因,如果我在字符串末尾留下一行空行,它将不被计算在内。 - Andres SK
@andufo,它确实有计数。不是吗?尝试在演示中添加一行额外的代码。它应该会显示4。 - Amit Joki
你最后一次更新后某处缺少了一个括号 :s - Andres SK
@andufo 是的,打错字了 :p - Amit Joki
感謝您的幫助,我最終採用了 @GioBorje 的解決方案,在所有情況下都運作良好。 - Andres SK
很高兴能够帮助到您 :) - Amit Joki

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接