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


Answers:


500

这可能是一个常见问题解答。无论如何,换行符(更好的是:换行符)可以是回车符(\r在旧版Mac上为CR,),\n换行符(\r\n在Unices 包括Linux上为LF,)或CR后跟LF(在WinDOS上)。(与另一个答案相反,这与字符编码无关。)

因此,RegExp匹配所有变体的最有效文字是

/\r?\n|\r/

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

/\r?\n|\r/g

分别。然后replace按照其他几个答案中的建议进行操作。(也许你并不想删除换行符,但与其他空格替换它们,例如空格字符,这样的话保持不变。)


15
为了完整起见,应注意Unicode中有四个不同的换行符:\u000a\n,它是换行符;\u000d\r,这是回车;\u2028,是行分隔符;和\u2029,一个段落分隔符。但是实际上,您发布的正则表达式在大多数情况下就足够了。
Mathias Bynens'5

4
@MathiasBynens谢谢,但是U + 2028和U + 2029显然构成HTML(4.01)中的换行符,DOM树和textarea的实时值基于这些换行符:w3.org/TR/html4/struct/text.html #whitespace
PointedEars 2012年

5
@PointedEars是的,但是.value动态设置textarea时,例如HTML不会序列化textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true。但这可能是一个极端的情况-正如我所说,在大多数情况下,您的正则表达式就足够了。
Mathias Bynens

2
@MathiasBynens因为U + 2028和U + 2029在HTML(4.01)中不构成换行符,所以在任何主要的DOM实现和布局引擎中,该赋值都不会在文本区域中显示两行。因此,没有一个在他们的头脑正确的人会首先进行这样的分配。
PointedEars 2012年

1
我必须转义反斜杠才能使它工作,例如textIn.replace(/(\\ r \\ n | \\ n | \\ r)/ gm,“”)。+1。谢谢
Crab Bucket

510

换行符的查找方式因操作系统编码而异。Windows会用\r\n,但Linux只用\n而Apple用\r

我在JavaScript换行符中发现了这一点:

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

那应该删除所有换行符。


18
为什么具有独立\r\n \n \r不仅仅是更好/[\n\r]/g?当然这比它应该的慢,因为它只需要对照两个可能的选项检查每个字符。
Gone Coding

2
当使用/ [\ n \ r] / g解析来自node.js中memcached的返回数据时,这对我来说很成功。谢谢编码!答案中的选项扼杀了它。
凯尔(Kyle Cooos)

111

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

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

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/

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


33
这只会删除字符串开头和结尾的换行符。OP询问如何删除所有换行符。
伊恩·沃尔特

4
是的,只需添加即可。
RobW

1
为我需要的工作-字符串的开头和结尾。谢谢!
哈林

46

您可以\n在正则表达式中使用换行符和\r回车符。

var str2 = str.replace(/\n|\r/g, "");

不同的操作系统使用不同的行结尾,\n并且和混合使用\r。此正则表达式将全部替换。


我认为这只会取代第一次发生的情况
塞巴(Sebas)2012年

5
/\n|\r/g被更有效地写作/[\n\r]/g甚至写作/[\n\r]+/g。除非绝对需要,否则请避免更改。
PointedEars 2012年

不确定是否要投诉。它按照我说的去做:删除不在该十六进制范围内的所有内容。当然,什么字符取决于字符集,但是本文是关于ASCII的。
masi

22

如果要删除所有控制字符,包括CR和LF,可以使用以下命令:

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

它将删除所有不可打印的字符。这是所有字符不是内的ASCII HEX空间0x20-0x7E。随时根据需要修改十六进制范围。


2
这也将来自非英语语言删除一些民族特色....
smentek

21

最简单的解决方案是:

let str = '\t\n\r this  \n \t   \r  is \r a   \n test \t  \r \n';
str.replace(/\s+/g, ' ').trim();
console.log(str); // logs: "this is a test"

.replace()使用/\s+/gregexp可以将整个字符串中的所有空白字符更改为单个空格,然后我们.trim()将结果删除文本前后所有超出的空白。

被视为空格字符:
[ \f\n\r\t\v​\u00a0\u1680​\u2000​-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]


太棒了,但是我让它重新分配了该变量:str = str.replace(/\s+/g, ' ').trim();
Fred K


15

要删除换行符,请使用以下命令:

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

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

yourString.trim()

6

PointedEars提供的答案就是我们大多数人需要的一切。但是,按照Mathias Bynens的回答,我进行了Wikipedia之旅,发现了这一点:https ://en.wikipedia.org/wiki/Newline 。

以下是一个插入函数,用于实现上述Wiki页面在回答此问题时认为“换行”的所有内容。

如果有什么不适合您的情况,请将其删除。另外,如果您不是要寻找性能,那对于在任何情况下都能胜任工作的快速工具来说,这应该很有用。

// replaces all "new line" characters contained in `someString` with the given `replacementString`
const replaceNewLineChars = ((someString, replacementString = ``) => { // defaults to just removing
  const LF = `\u{000a}`; // Line Feed (\n)
  const VT = `\u{000b}`; // Vertical Tab
  const FF = `\u{000c}`; // Form Feed
  const CR = `\u{000d}`; // Carriage Return (\r)
  const CRLF = `${CR}${LF}`; // (\r\n)
  const NEL = `\u{0085}`; // Next Line
  const LS = `\u{2028}`; // Line Separator
  const PS = `\u{2029}`; // Paragraph Separator
  const lineTerminators = [LF, VT, FF, CR, CRLF, NEL, LS, PS]; // all Unicode `lineTerminators`
  let finalString = someString.normalize(`NFD`); // better safe than sorry? Or is it?
  for (let lineTerminator of lineTerminators) {
    if (finalString.includes(lineTerminator)) { // check if the string contains the current `lineTerminator`
      let regex = new RegExp(lineTerminator.normalize(`NFD`), `gu`); // create the `regex` for the current `lineTerminator`
      finalString = finalString.replace(regex, replacementString); // perform the replacement
    };
  };
  return finalString.normalize(`NFC`); // return the `finalString` (without any Unicode `lineTerminators`)
});

3
首先-对于发现不使用JS的人们-“最多” RE风味支持\R即“所有”换行。其次-为什么不干脆someString.replace(new RegExp(lineTerminators.join('|')), '');
SamWhan

@ClasG,您说的很对。我认为编写此代码时,出于性能原因,我的思路是仅replace()针对lineTerminators字符串中存在的字符串运行。
futz.co

5

正则表达式中的换行符为\ n,因此您的脚本应为

var test = 'this\nis\na\ntest\nwith\newlines';
console.log(test.replace(/\n/g, ' '));

5

我正在添加我的答案,它只是上述内容的一个附加项,对于我来说,我尝试了所有/ n选项,但它不起作用,我看到我的文本来自服务器,带有双斜杠,因此我使用了此命令:

var fixedText = yourString.replace(/(\r\n|\n|\r|\\n)/gm, '');

5

请在下方使用此功能,轻松生活

最简单的方法是使用正则表达式来检测和替换字符串中的换行符。在这种情况下,我们将replace函数与string一起使用替换,在本例中为空字符串。

function remove_linebreaks( var message ) {
    return message.replace( /[\r\n]+/gm, "" );
}

在上面的表达式中,g和m代表全局和多行标志


2

请尝试以下代码。它适用于所有平台。

var break_for_winDOS = 'test\r\nwith\r\nline\r\nbreaks';
var break_for_linux = 'test\nwith\nline\nbreaks';
var break_for_older_mac = 'test\rwith\rline\rbreaks';

break_for_winDOS.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_linux.replace(/(\r?\n|\r)/gm, ' ');
//output
'test with line breaks'

break_for_older_mac.replace(/(\r?\n|\r)/gm, ' ');
// Output
'test with line breaks'

0

在Mac上,只需\n在regexp中使用以匹配换行符。因此代码将是string.replace(/\n/g, '')ps:后面的g表示匹配所有而不是仅匹配第一个。

在Windows上,它将为\r\n

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.