2016-03-29 5 views
1

Вот что я хочу сделать.regex для замены нескольких последующих разрывов строк

  1. Замените более трех разрывов на линии с тремя разрывами.
  2. Заменить 2 разрыва строки с 1 разрывом строки.
  3. Игнорировать отдельные разрывы.

Так что-то вроде этого:

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

Не совсем верно, как? Помните, что «более трех» означает '\ n \ n \ n +'. – tadman

+0

Трудно объяснить, потому что реальные данные являются частными. Я попытаюсь запутать его и как можно скорее добавить точные результаты на мой вопрос. –

+0

Будут ли '\ n' только разрывы строк? Нет '\ r \ n' s? –

ответ

1

Вы можете использовать регулярное выражение с группой чередования, on альтернатива будет соответствовать 4+ linebreaks, а другая только 2 (что не предшествует и не прерывается с разрывом строки).

Регулярное выражение будет:

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

Объяснение:

  • ((?:\r?\n){4,}) - Альтернативные 1 согласующие 4+ последовательности факультативного \r следуют с обязательной \n
  • | - или. ..
  • (^|[^\n])(?:\r?\n){2}(?!\r?\n) - Альтернатива 2, соответствующая точно 2 последовательностям необязательного \r, за которыми следует обязательный \n, который не предшествует ((^|[^\n]) соответствует либо началу строки, либо символу, отличному от \n), либо не следует с разрывом линии (отрицательный lookahead (?!\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) { 
 
\t return g1 ? "\n\n" : g2 + "\n"; 
 
}); 
 
document.body.innerHTML = "<pre>" + result + "</pre>";

+0

Вы можете настроить разрывы строк, например. добавьте '\ r'. –

+0

Если бы это был Reddit, я бы пометил вас как «Regex God» –

+0

Я не бог регулярного выражения. :) –

Смежные вопросы