JavaScript中使用正则表达式将多行换行符替换为单个换行符。

32

这是JavaScript中某种类型的变量内容:

    <meta charset="utf-8">

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




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

</head>

我希望将多行换行符(数量不确定)减少到一个换行符,同时保留其余的格式。这应该在javascript中使用regex完成。

我遇到了制表符或者无法保留格式的问题。


为什么?这不会更新或更改页面的源代码,我无法相信空白字符在DOM中是一个问题(如果它被保留的话)。我并不是说你不应该这样做,但我看不出它对你有什么好处。因此,可能有另一种方法来解决问题,那才是更好的解决方案。 - David Thomas
1
你可以使用这个正则表达式在vim中完成::g/^$/d - Eric Fortis
@DavidThomas 这是用于一种美化工具。 - e382df99a7950919789725ceeec126
所以它是在屏幕上呈现的文本中替换/删除空格?而不是在页面的实际HTML源代码/DOM中? - David Thomas
这应该使用正则表达式在JavaScript中完成。 - zerkms
4个回答

100

试试这个:

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');

有没有可能留下双倍行距而不是单倍行距,这样我就可以在行之间留出一定的距离? :) - e382df99a7950919789725ceeec126
我尝试了你的解决方案,它确实有效,但我不明白为什么。我读到正则表达式是“贪婪匹配”的,这意味着它会找到第一个匹配项。那么为什么这个正则表达式不能匹配每两个相邻的换行符并将其替换为一个换行符呢? - Amer Mograbi
1
@AmerMograbi 它需要两个相邻的换行符并将其替换为一个。例如,在foo\n\nbar上运行此命令将返回foo\nbar。贪婪匹配通常指正则表达式将尽可能匹配的事实,这就是为什么此表达式可用于匹配多个换行符,例如\n\n\n。否则,它只会匹配第一个换行符,然后对于\s*不匹配任何内容,并匹配第二个换行符,使第三个换行符保持不变。 - poke
@poke 哦,我现在明白了,谢谢!看来我误解了他们所说的“eager”的意思。 - Amer Mograbi

18
myText = myText.replace(/\n{2,}/g, '\n');​​​​​​​

查看演示


3

假设以下内容(记得将HTML实体进行编码,例如<>和(显然还有其他的)&):

<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.


1

要替换所有的多余换行符并只留下一个,请使用:

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

未捕获的语法错误 - tyasird

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