【问题标题】:regex - replace multi line breaks with single in javascript正则表达式 - 用 Ja​​vaScript 中的单个替换多行换行符
【发布时间】:2012-06-13 11:48:36
【问题描述】:

这是 javascript 中的某种可变内容:

    <meta charset="utf-8">

    <title>Some Meep meta, awesome</title>




    <-- some comment here -->
    <meta name="someMeta, yay" content="meep">

</head>

我想将多行换行符(未知数)减少为一个换行符,而其余的格式仍然保持不变。这应该在javascriptregex 中完成。

我对制表器有问题或保留格式。

【问题讨论】:

  • 为什么?这不会更新或更改页面的来源,而且我无法相信空白是 DOM 中的问题(如果它被保留的话)。我不是说你不应该这样做,但我看不出它为什么对你有好处。所以可能有另一种解决问题的方法,这是一个更好的解决方案。
  • 你可以在 vim 中使用这个正则表达式 :g/^$/d
  • @DavidThomas 它是为了一种美人
  • 所以它正在替换/删除屏幕上显示的文本中的空白?不在页面本身的实际 HTML 源代码/DOM 中?
  • 是的,我更新了问题。 :)

标签: javascript regex replace


【解决方案1】:

试试这个:

text.replace(/\n\s*\n/g, '\n');

这基本上是寻找两个换行符,中间只有空格。然后它用一个换行符替换它们。由于全局标志g,这对每个可能的匹配都重复。

编辑:

是否可以留下双换行符而不是单个换行符

当然,最简单的方法是查找三个换行符并将它们替换为两个:

text.replace(/\n\s*\n\s*\n/g, '\n\n');

如果您想在其中一行上保留空格(无论出于何种原因),您也可以这样做:

text.replace(/(\n\s*?\n)\s*\n/, '$1');

【讨论】:

  • 是否可以留下双换行符而不是单行换行符,我的行之间有距离? :)
  • 我尝试了您的解决方案并且它有效,但我不明白为什么。我读到正则表达式“急切地”匹配,这意味着它需要找到的第一个匹配项。为什么这个正则表达式不匹配每两个相邻的换行符然后用一个换行符替换它?
  • @AmerMograbi 它确实需要两个相邻的换行符并将其替换为一个。例如,在 foo\n\nbar 上运行它会返回 foo\nbar。急切匹配通常是指正则表达式将匹配尽可能多地匹配,这就是为什么该表达式可以匹配多个换行符的原因,例如\n\n\n。否则,它只会匹配第一个换行符,然后不匹配 \s* 并匹配第二个换行符,而第三个换行符保持不变。
  • @poke 哦,我现在明白了,谢谢!看来我误解了他们所说的“渴望”是什么意思。
【解决方案2】:
myText = myText.replace(/\n{2,}/g, '\n');​​​​​​​

See demo

【讨论】:

    【解决方案3】:

    鉴于以下情况(请记住对 HTML 实体进行编码,例如 &lt;&gt; 和(当然还有)&amp;):

    <pre>
    &lt;head&gt;
    
        &lt;meta charset="utf-8"&gt;
    
        &lt;title&gt;Some Meep meta, awesome&lt;/title&gt;
    
    
    
    
        &lt;-- some comment here -->
        &lt;meta name="someMeta, yay" content="meep"&gt;
    
    &lt;/head&gt;
    </pre>
    <pre>
    </pre>​
    

    以下 JavaScript 有效:

    var nHTML = document.getElementsByTagName('pre')[0].textContent.replace(/[\r\n]{2,}/g,'\r\n');
    document.getElementsByTagName('pre')[1].appendChild(document.createTextNode(nHTML));​
    

    JS Fiddle demo.

    【讨论】:

      【解决方案4】:

      要替换所有额外的换行符并只保留一次使用:

      myText = myText.replace(/\n\n*/g,'\r\n');​​​​​​​
      

      【讨论】:

      • 未捕获的语法错误
      猜你喜欢
      • 2019-04-16
      • 2013-01-10
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多