【问题标题】:How to remove all line breaks from a string如何从字符串中删除所有换行符
【发布时间】:2012-06-04 00:42:25
【问题描述】:

我在 textarea 中有一个文本,我使用 .value 属性将其读出。

现在我想使用带有正则表达式的 .replace 从我的文本中删除所有换行符(按 Enter 时产生的字符),但是如何在正则表达式?

如果不行,有没有其他办法?

【问题讨论】:

标签: javascript regex string


【解决方案1】:

如何找到换行符因操作系统编码而异。 Windows 应该是\r\n,但Linux 只使用\n 而Apple 使用\r

我在JavaScript line breaks找到这个:

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

这应该会删除所有类型的换行符。

【讨论】:

  • 为什么单独的\r\n \n \r/[\n\r]/g更好?当然这比它应该的要慢,因为它只需要根据两个可能的选项集检查每个字符。
  • 当使用 /[\n\r]/g 从 node.js 中的 memcached 解析返回的数据时,我成功了。感谢 Gone 编码!答案中的选项扼杀了它。
  • * Apple 停止在 MacOS X 中使用回车行结尾。
【解决方案2】:

换行符(更好:换行符)可以是回车(CR,\r,在较旧的 Mac 上),换行(LF,\n,在 Unices incl. Linux 上)或 CR 后跟 LF(@ 987654324@,在 WinDOS 上)。 (与另一个答案相反,这与字符编码无关。)

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

/\r?\n|\r/

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

/\r?\n|\r/g

分别。然后按照其他几个答案中的建议继续使用replace 方法。 (您可能想要删除换行符,而是将它们替换为其他空格,例如空格字符,以便单词保持原样。)

【讨论】:

  • 为了完整起见,需要注意的是Unicode中有四个不同的换行符:\u000a\n,是换行符; \u000d\r,是回车; \u2028,行分隔符;和\u2029,一个段落分隔符。但实际上,您发布的正则表达式在大多数情况下就足够了。
  • @MathiasBynens 谢谢,但是 U+2028 和 U+2029 明确地 not 构成 HTML (4.01) 中的换行符,DOM 树和 textarea 的实时值是基于该换行符的上:w3.org/TR/html4/struct/text.html#whitespace
  • @PointedEars 是的,但是动态设置 textarea 的 .value 时不会发生 HTML 序列化,例如textarea.value = 'a\u2029b'; textarea.value.charAt(1) == '\u2029'; // true。但这可能是一个极端情况——正如我所说,在大多数情况下,你的正则表达式就足够了。
  • @MathiasBynens 因为 U+2028 和 U+2029 不构成 HTML (4.01) 中的换行符,所以该分配确实在任何主要 DOM 的文本区域中显示两行实现和布局引擎。所以一开始没有人会做这样的任务。
  • @CrabBucket 不客气。但您的修改仅在字符串中有 literal(已经 转义)“\r”和“\n”,或者代码传递给eval() 时才有效或类似的东西(你应该避免)。
【解决方案3】:

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/

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

【讨论】:

  • 这只会删除字符串开头和结尾的换行符。 OP 询问如何删除所有换行符。
  • 是的,只是作为选项添加。
  • 为我需要的东西工作——字符串的开头和结尾。谢谢!
【解决方案4】:

您可以在正则表达式中使用\n 来表示换行,而\r 则用于回车。

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

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

【讨论】:

  • 我认为这只会取代第一次出现
  • /\n|\r/g 更有效地写成/[\n\r]/g 甚至/[\n\r]+/g。除非你绝对需要,否则避免交替。
  • 不确定这是否可以作为投诉。它做了我所说的:删除不在那个十六进制范围内的所有东西。当然,哪些字符取决于字符集,但这篇文章是关于 ASCII 的。
【解决方案5】:

最简单的解决方案是:

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"

.replace()/\s+/g 正则表达式将 所有组 空白字符更改为整个字符串中的单个空格,然后我们 .trim() 结果删除之前所有超出的空白并在正文之后。

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

【讨论】:

  • 太棒了,但我可以重新分配变量:str = str.replace(/\s+/g, ' ').trim();
【解决方案6】:

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

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

它将删除所有不可打印的字符。 This are ASCII HEX 空间 0x20-0x7E 内的所有字符 NOT。根据需要随意修改 HEX 范围。

【讨论】:

  • 这也会从英语以外的语言中删除一些国家字符....
【解决方案7】:
var str = "bar\r\nbaz\nfoo";

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

>> "barbazfoo"

【讨论】:

    【解决方案8】:

    要删除换行符,请使用:

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

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

    yourString.trim()
    

    【讨论】:

      【解决方案9】:

      这将用空格替换换行符。

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

      阅读更多关于this 的文章。

      【讨论】:

        【解决方案10】:

        使用下面的这个功能,让你的生活变得轻松

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

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

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

        【讨论】:

          【解决方案11】:

          PointedEars 提供的答案是我们大多数人所需要的一切。但是通过遵循 Mathias Bynens 的回答,我进行了一次维基百科之旅,发现了这个: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`)
          });
          

          【讨论】:

          • 首先——对于那些不使用 JS 的人来说——“大多数”RE 风格支持 \R,即“所有”换行符。其次 - 为什么不简单地someString.replace(new RegExp(lineTerminators.join('|')), '');
          • @ClasG,你说得很好。我认为我写这篇文章时的思路是只为字符串中存在的lineTerminators 运行replace(),因为性能原因。
          【解决方案12】:

          很简单,我们可以使用 text.replace(/\n/g, " ") 删除新行

          const text = 'Students next year\n GO \n For Trip \n';
          console.log("Original : ", text);
          
          var removed_new_line = text.replace(/\n/g, " ");
          console.log("New : ", removed_new_line);

          【讨论】:

            【解决方案13】:

            正则表达式中的换行符是\n,所以你的脚本应该是

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

            【讨论】:

              【解决方案14】:

              我正在添加我的答案,它只是上面的一个插件, 至于我,我尝试了所有的 /n 选项,但没有成功,我看到我的文本来自服务器,带有双斜杠,所以我使用了这个:

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

              【讨论】:

                【解决方案15】:

                试试下面的代码。它适用于所有平台。

                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'
                

                【讨论】:

                  【解决方案16】:

                  如果碰巧你不需要这个 htm 字符 &nbsp shile 使用 str.replace(/(\r\n|\n|\r)/gm, "") 你可以使用这个 str.split('\n').join('');

                  干杯

                  【讨论】:

                    【解决方案17】:

                    我经常将这个正则表达式用于 jsons 中的 (html) 字符串:

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

                    字符串来自 CMS 的 html 编辑器或 i18n php。常见的场景有:

                    - 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 应用程序的文本来说已经足够了。

                    【讨论】:

                      【解决方案18】:

                      在 mac 上,只需在正则表达式中使用 \n 来匹配换行符。所以代码将是string.replace(/\n/g, ''),ps:后面的g表示匹配所有而不是第一个。

                      在 Windows 上,它将是 \r\n

                      【讨论】:

                        【解决方案19】:

                        const text = 'test\nwith\nline\nbreaks'

                        const textWithoutBreaks = text.split('\n').join(' ')

                        【讨论】:

                        • 专业提示:考虑添加更多解释以帮助大家更好地理解答案,并使用代码围栏格式化您的代码
                        • OP 询问如何使用正则表达式。此外,\n 并不是唯一存在的换行符。
                        猜你喜欢
                        • 2012-10-29
                        • 2016-11-13
                        • 2010-11-04
                        • 1970-01-01
                        • 1970-01-01
                        • 2015-12-02
                        相关资源
                        最近更新 更多