【问题标题】:Replace multiple \n with 1 in JavaScript在 JavaScript 中将多个 \n 替换为 1
【发布时间】:2011-10-04 21:53:36
【问题描述】:

如何用一个替换多个\n?所以如果用户输入

blah 

blahdy blah



blah blah

我希望它最终看起来像。

blah
blahdy blah
blah blah

我知道我可以使用 while() 进行循环,但我更愿意使用正则表达式,因为我相信它更有效。

【问题讨论】:

    标签: javascript jquery regex


    【解决方案1】:

    这对我有用:

    string = string.replace(/\n+/g, '\n');
    

    正如其他人所说,它将每次出现的一个或多个连续换行符 (\n+) 替换为一个。

    g 实现“全局”替换,这意味着它会替换字符串中的所有匹配项,而不仅仅是第一个匹配项。

    编辑:如果您还想考虑其他操作系统的行尾样式(例如,\r\n),您可以进行多步替换:

    string = string.replace(/(\r\n)+/g, '\r\n') // for Windows
        .replace(/\r+/g, '\r')                  // for Mac OS 9 and prior
        .replace(/\n+/g, '\n');                 // for everything else
    

    OR(感谢Renesis 提出这个想法):

    string = string.replace(/(\r\n|\r|\n)+/g, '$1');
    

    如果您事先知道要处理的文本类型,那么上面的内容可能有点矫枉过正,因为它会带来明显的性能成本。

    【讨论】:

    • 正如我在另一个答案中所说:如果输入来自 Windows 上使用默认操作系统行尾的应用程序,or any other OS with CR+LF line endings 这将不起作用,因为字符看起来像:\r\n\r\n\r\n .请注意,一行中没有多个 \n 字符。
    • 在您的编辑中,.replace(/(\r\n)+/g, '\r\n') 应该是.replace(/(\r\n)+/g, '\n'),这样第二个.replace() 就不需要处理\r
    • @patrick dw:如果 OP 想要保留原始行结束格式,不是吗?
    • 是的,如果你想保留它,那么你会保持原样。
    • @patrick 我认为编辑看起来不错。这对于在原始操作系统中正确显示结果字符串更安全,因为它保留了行尾。与第二个replace 没有冲突,因为\r\n 行结尾没有重复的\r 字符。 @Dan +1 供您编辑。
    【解决方案2】:

    只需使用字符类将一个或多个\n\r 替换为单个\n

    var newString = oldString.replace(/[\n\r]+/g, "\n");
    

    测试 HTML:

    <script>
    function process(id) {
        var oldString = document.getElementById(id).value;
        var newString = oldString.replace(/[\n\r]+/g, "\n");
        return newString;
    }
    </script>
    <textarea id="test"></textarea>
    <button onclick="alert(process('test'));">Test</button>
    

    请注意:在现代网络和大多数现代应用程序中,单个\n 行结尾被优雅地处理,这就是我在这里使用它作为替换字符串的原因。但是,CR+LF (\r\n) operating systems 上的一些更原始的应用程序将显示所有文本一起运行而没有完整的\r\n,在这种情况下,您可以使用Dan Tao's answer,它提供了一种保留行尾的解决方案,或者以下,它完成了类似的一次通话:

    string.replace(/(\r\n|\r|\n)+/g, "$1");
    

    【讨论】:

      【解决方案3】:
      var blah = "blah\n\nblahdy blah\n\n\n\nblah blah\n";
      var squeezed = blah.replace(/\n+/g, "\n");
      

      【讨论】:

      • 如果输入来自 Windows 上使用默认操作系统行尾的应用程序,or any other OS with CR+LF line endings 这将不起作用,因为文本看起来像:\r\n\r\n\r\n。请注意,一行中没有多个 \n 字符。
      • @Resis 你是对的。我不再在 Windows 中进行大量开发,所以忽略了这一点。 @mazlix 你应该接受 Renesis 的回答,因为它是正确的并且有一个例子。
      【解决方案4】:

      你可以使用正则表达式

      xx.replace(/\n+/g, "\n");
      

      【讨论】:

        【解决方案5】:

        或者没有 JavaScript 引擎设置有限状态机来运行正则表达式的开销,您可以使用数组来做到这一点:

        s = s.split("\n").join("");
        

        【讨论】:

        • 很有趣,运行正则表达式听起来很重量级,但是否有关于性能差异的真实证据?
        • 拆分和连接都是O(n),开销相对较小,匹配一个字符串到一个正则表达式是O(mn),m = FSM中的状态数,加上需要设置。当数学告诉你时,你不需要现实世界;)
        • 我不敢苟同,因为这些操作的常量在这种情况下发挥着非常重要的作用。
        • 这是一个例子,即拆分和连接(非常简单的过程)中操作的复杂性是否超过了设置和执行正则表达式的开销。我知道我更愿意去哪个。另请注意,虽然元素更大,但连接的 n 小于拆分的 n。
        • 除非不行,-1。而且我敢打赌,在有大量行的字符串上速度会更慢。
        【解决方案6】:

        对带有详细示例的空格执行相同操作:Regex to replace multiple spaces with a single space。示例:

        var str = "The      dog        has a long tail,      and it is RED!";
        str = str.replace(/ {2,}/g,' ');
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-01
          • 2020-05-24
          • 1970-01-01
          • 2011-03-15
          • 1970-01-01
          相关资源
          最近更新 更多