如何从字符串中删除所有换行符

649

我在一个文本框里有一段文本,使用.value属性将其读出。现在我想使用正则表达式和.replace方法从文本中删除所有的换行符(当你按下Enter键时生成的字符),但是我该如何在正则表达式中指示一个换行符?

如果无法实现这个目标,是否有其他方法可以实现?


可能是重复的问题,参考如何使用<br />标签替换字符串中的所有换行符? - Jun
21个回答

774

不同操作系统编码方式下查找换行符的方法各有不同。在Windows中是\r\n,但Linux只使用\n,而Apple使用\r

我在JavaScript line breaks中找到了这个信息。

someText = someText.replace(/(\r\n|\n|\r)/gm, "");

那应该能够移除所有类型的换行符。


42
为什么拥有单独的\r\n\n\r比只使用/[\n\r]/g更好?这样做肯定比应该慢,因为它只需要将每个字符与两种可能的选项集进行比较。 - iCollect.it Ltd
3
在使用 /[\n\r]/g 对 node.js 中的 memcached 返回数据进行解析时,这个方法对我很有用。感谢 Gone Coding!答案中的选项弄巧成拙了。 - Kyle Coots
苹果在MacOS X中停止使用回车换行符。 - cael ras

638

换行符(更好的称呼是“换行符”)可以是回车符(CR,在旧版 Mac 上为\r),换行符(LF,在 Unix 包括 Linux 上为\n)或者 CR 后跟 LF(在 WinDOS 上为\r\n)。 (与另一个答案相反,这与字符编码无关。)

因此,最有效的 RegExp 字面量来匹配所有变体是

/\r?\n|\r/

如果你想匹配字符串中的所有换行符,请使用全局匹配。

/\r?\n|\r/g

然后按照其他答案中建议的使用replace方法进行处理(可能您不想删除换行符,而是用其他空格(例如空格字符)替换它们,以保持单词完整性)。


22
为了完整起见,应该指出Unicode中有四个不同的换行符:\u000a\n,是换行符;\u000d\r,是回车符;\u2028,是行分隔符;以及\u2029,是段落分隔符。然而,在实践中,你发表的正则表达式在大多数情况下已经足够了。 - Mathias Bynens
5
@MathiasBynens 感谢您的回复,但是在 HTML(4.01)中,U+2028 和 U+2029 并不明确构成换行符,而 DOM 树和文本框的实时值是基于该规范的:http://www.w3.org/TR/html4/struct/text.html#whitespace - PointedEars
5
是的,但是当动态设置文本区域的 .value 属性时并不会发生 HTML 序列化,例如 textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true。但这可能是一种边缘情况 - 如我所说,在大多数情况下,您的正则表达式是足够的。 - Mathias Bynens
2
@MathiasBynens 因为在 HTML(4.01)中,U+2028 和 U+2029 不构成换行符号,所以不管是哪个主流的 DOM 实现和排版引擎,都不会将该赋值在 textarea 中显示为两行。因此,任何理智的人都不会首先采取这样的赋值方式。 - PointedEars
1
我不得不转义反斜杠才能让这个对我起作用,即textIn.replace(/(\r\n|\n|\r)/gm, "")。+1仍然有效。谢谢。 - Crab Bucket
2
@CrabBucket 不客气。但是您的修改仅在字符串中有字面值(已经转义)的“\r”和“\n”,或者代码被传递给eval()或类似的函数(这应该避免)时才有效。 - PointedEars

181

var str = " \n this is a string \n \n \n"

console.log(str);
console.log(str.trim());

< p >String.trim()方法可用于删除字符串开头和结尾的空白字符,包括换行符。

const myString = "   \n \n\n Hey! \n I'm a string!!!         \n\n";
const trimmedString = myString.trim();

console.log(trimmedString);
// outputs: "Hey! \n I'm a string!!!"

这里有一个示例代码片段:http://jsfiddle.net/BLs8u/

注意! 它仅仅裁剪字符串的开头和结尾,而不是中间的换行符或空格。


51
这只会去除字符串开头和结尾的换行符。楼主想知道如何去除所有换行符。 - Ian Walter
7
好的,只是作为一种选项添加。 - RobW
4
做我需要的事情了——字符串开头和结尾。谢谢! - Harlin

89
你可以在正则表达式中使用 \n 来表示换行,而 \r 则表示回车。
var str2 = str.replace(/\n|\r/g, "");

不同的操作系统使用不同的行尾符,其中包含不同的\n\r的组合。这个正则表达式可以替换它们。


我认为这只会替换第一次出现的内容。 - Sebas
8
/\n|\r/g 可以更高效地写成 /[\n\r]/g 或者甚至是 /[\n\r]+/g。除非绝对必要,否则应避免使用选择符(alternation)。 - PointedEars
1
不确定这是否应该被视为抱怨。它做了我说的:删除HEX范围之外的所有内容。当然,这取决于字符集中的字符,但是这篇文章是关于ASCII的。 - omni

59
最简单的解决方案是:
let str = '\t\n\r this  \n \t   \r  is \r a   \n test \t  \r \n';
str = str.replace(/\s+/g, ' ').trim();
console.log(str); // logs: "this is a test"

使用正则表达式/\s+/g.replace()方法会将整个字符串中所有的空白字符组替换为一个空格,然后使用.trim()方法去掉文本前后多余的空格。
被视为空格字符的有:[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]

1
很棒,但我通过重新分配变量来使其工作:str = str.replace(/\s+/g, ' ').trim(); - Fred K
这是答案。 - undefined

24

如果您想要删除所有控制字符,包括 CR 和 LF,请使用以下代码:

myString.replace(/[^\x20-\x7E]/gmi, "")

它将删除所有不可打印字符。这些都是不在ASCII HEX空间0x20-0x7E内的字符。如有需要,可以自由修改HEX范围。


2
这也会删除一些非英语语言的国际字符... - smentek
谢谢!这对我来说非常完美。我有一些不是 \n 的换行符,这让我很烦恼。 - Dror Bar

19

这将把换行符替换为空格。

someText = someText.replace(/(\r\n|\n|\r)/gm,"");

这篇文章中了解更多信息。


18
var str = "bar\r\nbaz\nfoo";

str.replace(/[\r\n]/g, '');

>> "barbazfoo"

17

要去除换行符,请使用以下代码:

yourString.replace(/\r?\n?/g, '')

然后,您可以修剪字符串以去除前导和尾随空格:

然后,您可以修剪字符串以去除前导和尾随空格:

yourString.trim()

12

我经常使用这个正则表达式来处理json中的(html)字符串:

replace(/[\n\r\t\s]+/g, ' ')

这些字符串来自于CMS或i18n php中的html编辑器。常见的情况有:

- lorem(.,)\nipsum
- lorem(.,)\n ipsum
- lorem(.,)\n
  ipsum
- lorem   ipsum
- lorem\n\nipsum
- ... many others with mixed whitespaces (\t\s) and even \r

正则表达式可以避免这些丑陋的事情:
lorem\nipsum    => loremipsum
lorem,\nipsum   => lorem,ipsum
lorem,\n\nipsum => lorem,  ipsum
...

当然,并非适用于所有情况,也不是最快的方法,但对于大多数网站或Web应用程序的文本区域和文本来说已经足够。


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