Создание регулярного выражения для удаления последовательных пробелов, кроме новых строк

В GitHub имеется удобная библиотека:

https://github.com/serkanyersen/ifvisible.js

Пример:

// If page is visible right now
if( ifvisible.now() ){
  // Display pop-up
  openPopUp();
}

Я тестировал версию 1.0.1 во всех браузерах, которые у меня есть, и могу подтвердить, что он работает с:

  • IE9, IE10
  • FF 26.0
  • Chrome 34.0

... и, возможно, все более новые версии.

Не работает в полной мере с:

  • IE8 - всегда указывать, что вкладка / окно в настоящее время активна (.now() всегда возвращает true для меня)

0
задан user246392 3 March 2019 в 15:35
поделиться

2 ответа

Чтобы сопоставить любой пробел, кроме новой строки, вы можете использовать [^\S\n] класс отрицанных символов. Или [\s-[\n]], но я предпочитаю первый, так как он переносим на другие движки регулярных выражений.

Теперь вы можете использовать регулярное выражение, которое будет соответствовать необязательным символам новой строки слева и справа от 1+ пробелов, отличных от новой строки. Затем вы можете проверить, совпадали ли какие-либо символы новой строки, и, если да, опустить пропущенный пробел, в противном случае заменить совпадение пробелом. Затем вам нужно будет заменить любые фрагменты из 3 или более символов новой строки двумя символами новой строки.

var result = Regex.Replace(input, @"(\n?)[^\S\n]+(\n?)", m =>
    !string.IsNullOrEmpty(m.Groups[1].Value) || !string.IsNullOrEmpty(m.Groups[2].Value) // If any \n matched
        ? $"{m.Groups[1].Value}{m.Groups[2].Value}" // Concat Group 1 and 2 values
        : " ");  // Else, replace the 1+ whitespaces matched with a space
var final_result = Regex.Replace(result, @"\n{3,}", "\n\n"); // Replace 3+ \ns with two \ns

Подробности

  • (\n?) - Захват группы 1: необязательный символ новой строки
  • [^\S\n]+ - 1+ пробелы, отличные от новой строки [ 118]
  • (\n?) - Группа захвата 2: необязательный перевод новой строки
  • \n{3,} - 3 или более новых строк.
0
ответ дан Wiktor Stribiżew 3 March 2019 в 15:35
поделиться

Простое многошаговое решение выглядит следующим образом:

Все пробельные символы, кроме символов новой строки, должны быть преобразованы в пробел (т. Е. \ F, \ r, \ t, \ v будут преобразованы в пробел)

output = Regex.Replace(input, "[\\f\\r\\t\\v ]+", " ");

Пробел входит в вышеуказанную группу.

Если пробел предшествует или следует за новой строкой, пробел должен быть удален.

output = Regex.Replace(output, " \n", "\n");
output = Regex.Replace(output, "\n ", "\n"); 

Приведенные выше два можно вместо этого изменить на использование String.Replace в стиле:

output = output.Replace(" \n", "\n");
output = output.Replace("\n ", "\n");

или даже на:

output = output.Replace(" \n", "\n").Replace("\n ", "\n");
[1114 ] Строка не может иметь два или более последовательных пробелов, кроме новых строк. Новые строки ограничиваются максимум двумя последовательными вхождениями (т. Е. \ N все в порядке, \ n \ n тоже хорошо, но \ n \ n \ n недопустимо и должно быть заменено на \ n \ n).

output = Regex.Replace(output, "\n\n\n+", "\n\n");

Как в стороне. Если система использует \r\n для последовательностей новой строки, то подавление символов \r может привести к нежелательным результатам.

0
ответ дан AdrianHHH 3 March 2019 в 15:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: