JavaScript:如何使用正则表达式从字符串中删除空行?

IT技术 javascript regex blank-line
2021-03-18 17:09:45

我需要使用 JavaScript 删除 HTML 文本框中的空行。空行可以位于textarea元素中的任何位置空行可以只是一个回车或空格加回车。

我期待一个正则表达式解决方案。以下是我尝试过的一些方法,但它们不起作用,无法弄清楚原因:

/^\s*\r?\n/g   

/^\s*\r?\n$/g

编辑 1

看来 aaronman 和 m.buettner 建议的解决方案(我稍微修改了一下)有效:

string.replace(/^\s*\n/gm, "") 

有人能说出为什么我的第一个正则表达式不起作用吗?

编辑 2

在阅读了所有有用的答案后,我想出了这个:

/^[\s\t]*(\r\n|\n|\r)/gm

这将是一种涵盖所有情况的方法吗?

编辑 3

这是最简洁的一种,涵盖所有空间(空格、制表符)和平台(Linux、Windows、Mac)。

/^\s*[\r\n]/gm

非常感谢 m.buettner!

5个回答

你的模式似乎好了,你只需要包括多修改m,使^$匹配行的开头和结尾,以及:

/^\s*\n/gm

没有m,锚只匹配字符串的开头和结尾。

请注意,您错过了 UNIX 样式的行结尾(仅\r)。在这种情况下,这将有所帮助:

/^\s*[\r\n]/gm

另请注意(在这两种情况下)您不需要显式匹配\r前面的可选\n,因为这是由\s*.

正如Dex在评论中指出的那样,如果最后一行仅包含空格(并且后面没有换行符),则它无法清除最后一行。解决这个问题的一种方法是使实际的换行符可选,但在它之前包含一个行尾锚点。在这种情况下,你必须匹配结束妥善虽然行:

/^\s*$(?:\r\n?|\n)/gm
m.buettner,我创建了一个新的 /^[\s\t]*(\r\n|\n|\r)/gm。它会涵盖所有情况吗?
2021-04-22 17:09:45
@curious1,\s 包括所有空格。即空格、\t、\r 和\n。这就是首先使用 \s 的意义所在。因此,我们的模式完全相同,是的,它们都涵盖了所有情况。
2021-04-25 17:09:45
如果最后一行是空白,这将失败,因为没有回车,这可能是最常见的情况。需要问号。/^\s*[\r\n]?/gm
2021-05-02 17:09:45
m.buettner,非常感谢详细而清晰的解释。最好的。
2021-05-05 17:09:45
m.buettner,非常感谢您指出 Mac 场景。
2021-05-16 17:09:45

我相信这会奏效

searchText.replace(/(^[ \t]*\n)/gm, "")
修复了它,他的原始帖子没有说如果一行中有实际空格,则该行是空的
2021-05-07 17:09:45
这将不允许在\r\n换行符前有任何其他空格。
2021-05-18 17:09:45
aaronman,感谢您提供额外的代码来捕获 \t。欣赏它!
2021-05-19 17:09:45

这应该可以解决我认为的问题:

var el = document.getElementsByName("nameOfTextBox")[0];
el.value.replace(/(\r\n|\n|\r)/gm, "");

编辑:删除三种类型的换行符。

啊……我想是时候睡觉了;)
2021-04-21 17:09:45
这将删除所有换行符(不仅仅是空行),并且m是多余的。
2021-04-22 17:09:45
\r\n 通常是 windows,\n linux 和 \r mac,如果我没记错的话。
2021-04-24 17:09:45
他主要是想去掉换行符
2021-05-05 17:09:45
Bjørn Bråthen,感谢您展示所有三种类型的换行符,这对我来说真的很新。再次感谢!
2021-05-19 17:09:45

这是另一个解决方案

string = string.replace(/^(?=\n)$|^\s*|\s*$|\n\n+/gm, "")

它似乎可以处理空行和纯空格行。

function removeEmptyLine(text) {
  return text.replace(/(\r?\n)\s*\1+/g, '$1');
}

测试:

console.assert(removeEmptyLine('a\r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n\r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n \r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n \r\n  \r\nb') === 'a\r\nb');
console.assert(removeEmptyLine('a\r\n \r\n 2\r\n  \r\nb') === 'a\r\n 2\r\nb');
console.assert(removeEmptyLine('a\nb') === 'a\nb');
console.assert(removeEmptyLine('a\n\nb') === 'a\nb');
console.assert(removeEmptyLine('a\n \nb') === 'a\nb');
console.assert(removeEmptyLine('a\n \n  \nb') === 'a\nb');
console.assert(removeEmptyLine('a\n \n2 \n  \nb') === 'a\n2 \nb');