2016-04-17 2 views
0

Привет, я хочу удалить лишние пустые строки в исходном текстовом файле (это означает, что если есть две или более пустых строк, используйте только одну пустую строку). Я использовал этот шаблон:Удалите лишние пустые строки в текстовом файле с помощью регулярного выражения

^(\s*(\n|\r|\r\n)){2,} 

Он не может обрабатывать пустые строки в конце файла, как это:

1. BlablablaCRLF 
2. CRLF 
3. 

выше (строка 3) является конец файла, VS StyleCop жалуется, что существует несколько пустые строки здесь. он выглядит как новая строка в конце файла, но на самом деле ничего нет, я включил «Показать все символы» в блокноте ++, я ожидал увидеть CRLF в конце файла, но этого не произошло. Моя модель не может идентифицировать это, как справиться с этим делом? Благодаря!

+0

Ваше регулярное выражение говорит, что совпадение как минимум '\ s' (если оно есть) вместе с любым из' \ n', '\ r' или' \ r \ n' не менее двух раз – rock321987

+0

Я думаю, что если вы используете стиль resharper есть автоматическое исправление для этого конкретного нарушения, так что вы можете исправить все свое решение, не загружая собственное регулярное выражение. (может быть, проще написать крошечное консольное приложение, чтобы это все равно). – briantyler

ответ

1

Basic Ответ

Если это то, что вы хотите, чтобы соответствовать:

  1. Несколько непрерывных пустых строк, где множество средств> 1.
  2. Все пустые строки в конце файла, за исключением одного неявно сгенерированный \n - перевод файла (что можно считать хорошей практикой, см. here).
  3. Все избыточные пробелы после окончания \n.

Тогда эта модель может помочь вам:

(^\s*(\r|\n)){2,}|^\s+(\r|\n)?\Z 

Далее Разъяснение

Первая часть (^\s*(\r|\n)){2,} заботится 1., вторую часть ^\s+(\r|\n)?\Z матчи лишними пустые строки в конце файла или избыточные пробелы после завершения \n.

Если ваш файл выглядит следующим образом (с окончаниями Unix файлов) ...

1. FirstLine\n 
2. 
3. ThirdLine\n 
4. FourthLine\n 
5. 
6. 
7. SeventhLine\n 

... то он соответствует только линии 5 и 6, но ничего в конце. Notepad ++, хотя будет показывать 8-ю строку в конце из-за завершающего \n. Однако, если в конце файла будет несколько \n s или если будет добавлено \t или пробелы после окончания \n в 7-й строке, они совпадут.

Если вы хотите, чтобы соответствовать линиям, порожденных прекращением \n (и в результате удаления прекращения \n при замене), вы можете также использовать ^\s*\Z вместо второй части регулярного выражения.

Дополнительное объяснение \s*(\r\n): Это соответствует каждой разрешенной комбинации, как abc\n, abc\r\n или abc\r потому что \s также включает в себя \n и \r.

\Z соответствует концу всего файла/ввода (тогда как $ соответствует только концу строки).

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

+0

Пожалуйста, взгляните на мое редактирование для решения для обработки отдельных строк (возможно, решение проблемы «не менее 2 совпадений»). :) – mxscho

+0

Спасибо, но как это сделать, если я хочу оставить одну пустую строку? Если \ n появляется не менее 2 раз, замените их на «\ n»; если \ n появляется в конце файла, удалите это \ n (замените пустой строкой), как выразить это в регулярном выражении? Благодаря! @mxscho – codewarrior

+0

Это, очевидно, меняет вопрос - по крайней мере, я не знал, чего вы на самом деле хотели достичь вначале. Я потратил некоторое время и полностью переработал свой ответ, так что, надеюсь, это может помочь вам гораздо больше. – mxscho

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