67

我需要使用 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!

4

5 回答 5

92

您的模式似乎没问题,您只需要包含多行修饰符m,以便匹配行的开头和结尾^$

/^\s*\n/gm

如果没有m,则锚点仅匹配字符串的开头和结尾。

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

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

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

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

/^\s*$(?:\r\n?|\n)/gm
于 2013-05-04T01:34:12.073 回答
22

我相信这会奏效

searchText.replace(/(^[ \t]*\n)/gm, "")
于 2013-05-04T01:21:15.027 回答
7

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

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

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

于 2013-05-04T01:23:53.973 回答
1

这是另一个解决方案

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

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

于 2021-06-08T08:54:04.733 回答
-1
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');
于 2020-08-29T07:12:06.320 回答