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

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

85784 次浏览

我相信这会有用的

searchText.replace(/(^[ \t]*\n)/gm, "")

这个应该有用,我想:

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

删除三种类型的换行符。

你的模式看起来不错,你只需要包含多行修饰符 m,这样 ^$也能匹配行的开头和结尾:

/^\s*\n/gm

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

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

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

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

正如 德克斯在注释中指出的那样,如果最后一行只包含空格(并且后面没有换行符) ,那么它将无法清除该行。解决这个问题的一种方法是,让实际的换行符成为可选的,但是在换行符之前要包含一个行尾锚点。在这种情况下,你的 必须正确匹配行结束,但:

/^\s*$(?:\r\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');

这里是 另一个解决办法:

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

它似乎同时处理空行和只有空格的行。