正则表达式替换多个后续换行符

时间:2016-03-29 21:27:41

标签: javascript regex

这是我想要做的。

  1. 使用3个换行符替换3个换行符。
  2. 用1个换行符替换2个换行符。
  3. 忽略单线换行。
  4. 这样的事情:

    Dear Bob
    
    
    
    I would love to not have so many line breaks here.
    
    This is a new paragraph.
    
    
    
    
    Thanks
    
    Jim
    

    更像这样结束:

    Dear Bob
    
    I would love to not have so many line breaks here.
    This is a new paragraph.
    
    Thanks
    Jim
    

    基于另一个问题,这是我最接近的问题,但它并不完全正确:

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

1 个答案:

答案 0 :(得分:1)

您可以将正则表达式与替换组一起使用,一个替代方案将匹配4个以上的换行符,另一个替代方案只有2个(不在其前面或后面跟一个换行符)。

正则表达式将是:

((?:\r?\n){4,})|(^|[^\n])(?:\r?\n){2}(?!\r?\n)

解释

  • ((?:\r?\n){4,}) - 替代1个匹配4+序列的可选\r后跟强制\n
  • | - 或......
  • (^|[^\n])(?:\r?\n){2}(?!\r?\n) - 备选方案2恰好与可选\r的2个序列匹配,后跟不在前的强制\n(^|[^\n])匹配字符串的开头或\n以外的字符,也没有后跟换行符(否定前瞻(?!\r?\n)确保这一点)。

在替换中,有一个回调检查哪个替代匹配并替换为补偿。

JS代码演示如下:

var re = /((?:\r?\n){4,})|(^|[^\n])(?:\r?\n){2}(?!\r?\n)/g; 
var str = `Dear Bob



I would love to not have so many line breaks here.

This is a new paragraph.




Thanks

Jim`;
var result = str.replace(re, function (m, g1, g2) {
	return g1 ? "\n\n" : g2 + "\n";
});
document.body.innerHTML = "<pre>" + result + "</pre>";