Как мне удалить конечные пробелы с помощью регулярного выражения?

Я хочу удалить конечные пробелы и табуляции из моего кода без удаления пустых строк.

Я старался:

\s+$

а также:

([^\n]*)\s+\r\n

Но все они также удалили пустые строки. Похоже \s также соответствует символам конца строки.


ОБНОВЛЕНИЕ (2016):

В настоящее время я автоматизирую такую ​​очистку кода с помощью пакета TrailingSpaces Sublime с пользовательскими / пользовательскими настройками:

"trailing_spaces_trim_on_save": true

Он выделяет конечные пробелы и автоматически обрезает их при сохранении.

12 ответов

Решение

Попробуйте просто удалить завершающие пробелы и вкладки:

[ \t]+$

Чтобы удалить конечные пробелы и сохранить строки, содержащие только пробелы, вы хотите, чтобы регулярное выражение удаляло конечные пробелы только после непробельных символов. Поэтому вам нужно сначала проверить наличие непробельного символа. Это означает, что символ без пробелов будет включен в совпадение, поэтому вам нужно включить его в замену.

Regex: ([^ \t\r\n])[ \t]+$

Замена: \1 или же $1в зависимости от IDE

Платформа не указана, но в C# ( .NET) это будет:

Регулярное выражение (предполагает многострочный параметр - в приведенном ниже примере):

    [ \t]+(\r?$)

Замена:

    $1

Объяснение "\r?$" См. В разделе Параметры регулярных выражений, Многострочный режим (MSDN).

Пример полного кода

Это удалит все завершающие пробелы и все завершающие вкладки во всех строках:

string cleanedUpText = Regex.Replace(inputText,
                                     @"[ \t]+(\r?$)", @"$1",
                                     RegexOptions.Multiline);

Regex, чтобы найти конечные и ведущие пробелы:

^[ \t]+|[ \t]+$

[ |\t]+$ с пустой заменой работает.
\ s + ($) с заменой $1 также работает. по крайней мере в vscode...

Если вы используете Visual Studio 2012 и более поздние версии (в которых используются регулярные выражения.Net), вы можете удалить конечные пробелы, не удаляя пустые строки, используя следующее регулярное выражение

замещать (?([^\r\n])\s)+(\r?\n|\z)

С $1

введите описание изображения здесь


Некоторое объяснение

Причина, по которой вам нужно довольно сложное выражение, заключается в том, что класс символов \s соответствует пробелам, символам табуляции и символам новой строки, поэтому \s+ будет соответствовать группе строк, содержащих только пробелы. Это не помогает добавить $ завершение этого регулярного выражения, потому что оно все равно будет соответствовать группе строк, содержащей только пробел и символы новой строки.

Вы также можете знать (как я) точно, что (?([^\r\n])\s) выражение означает. Это альтернативная конструкция, которая фактически означает соответствие классу пробельных символов, если это не возврат каретки или перевод строки.

Чередующиеся конструкции обычно имеют истинную и ложную части,

(?( expression ) yes | no )

но в этом случае ложная часть не указана.

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

(?<=\S)\s+$

Заглядывание - это способ исключить непропуск (\S) из совпадения.

Вы можете использовать регулярное выражение /^[ \t\v\f]+\S.*$/gm чтобы удалить начальные пробелы в каждой строке, не касаясь ни пустых строк, ни конечных пробелов:

const str = ' X \n\nY Y\n \n Z'.replace(/^[ \t\v\f]+(\S.*)$/gm, '$1');
console.log(str);
// output: 'X \n\nY Y\n \nZ'

Если вы хотите более надежную поддержку, хотя и немного медленнее, используйте регулярное выражение /^[ \t\v\f\xA0\uFEFF]+(\S.*)$/gm, который включает в себя NBSP и BOM, что делает его ближе к \s поведение.

ДОБАВЛЕНО:

Это более просто и соответствует \s поведение: /^(?=\s+).+(\S.*)$/gm... но я не знаю, будет ли это работать в старых браузерах.

ВНИМАНИЕ: Любое решение, основанное на простом регулярном выражении, может нарушить строки ES6 TL.

Как ни странно, я не смог получить/[\t ]+$/mработать на PHP. Я пробовал варианты других ответов здесь, но все равно не удалось.

Итак, вместо этого я пошел с этой заменой:

      <?php
$contents = preg_replace('/[\t ]+(\v)/', '$1', $contents);

Чтобы удалить пробелы в конце, используйте это:

\n|^\s+\n

Я тестировал в редакторах Atom и Xcode. Я надеюсь, что это привыкло к кому-то одному.

В Java:



String str = "    hello world  ";

// prints "hello world" 
System.out.println(str.replaceAll("^(\\s+)|(\\s+)$", ""));


Вы можете просто использовать как это

var regex = /( )/g;

образец: нажмите здесь

Другие вопросы по тегам