92

I want to remove trailing white spaces and tabs from my code without removing empty lines.

I tried:

\s+$

and:

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

But they all removed empty lines too. I guess \s matches end-of-line characters too.


UPDATE (2016):

Nowadays I automate such code cleaning by using Sublime's TrailingSpaces package, with custom/user setting:

"trailing_spaces_trim_on_save": true

It highlights trailing white spaces and automatically trims them on save.

Stevoisiak
  • 23,794
  • 27
  • 122
  • 225
ellockie
  • 3,730
  • 6
  • 42
  • 44

11 Answers11

171

Try just removing trailing spaces and tabs:

[ \t]+$
qbert220
  • 11,220
  • 4
  • 31
  • 31
  • 1
    How would I exclude lines which contain only whitespaces, tabs or a mixture of them? – Daniel F Jun 05 '13 at 10:14
  • 3
    @DanielF. `([^ \t])[ \t]+$`, but you'd have to replace with `\1` instead of an empty string. – KOVIKO Jan 04 '14 at 13:49
  • @Koviko Thanks, but what I meant was that lines which contain only whitespaces or tabs, like indented functions in Python, where indentation is important, should be left as they are. I don't see the suggested regex doing that. – Daniel F Jan 05 '14 at 23:28
  • 1
    @DanielF. The regex I posted looks for non-space characters preceding the space characters, and preserves the non-space characters with the `\1` replacement. Lines that consist of only space characters will not match this regex and will be skipped. – KOVIKO Jan 07 '14 at 04:06
  • @Koviko This should showcase the issue: http://jsfiddle.net/s7vW5/2/ .The whitespace-only line between foo and bar should contain two spaces. Python's flavor of regex behaves the same. – Daniel F Jan 07 '14 at 12:15
  • 6
    @DanielF. In my case, I was using a text editor (Notepad++) that counts each line as a string, not the entire document as a string. As such, newline characters are ignored. To handle the case where newline characters are not ignored, simply add them to the regex: `([^ \t\r\n])[ \t]+$` – KOVIKO Jan 08 '14 at 15:30
  • 3
    @Koviko: Since your comment is the correct solution to the problem and the answer you've commented on is not, I suggest you post that regex as a separate answer.  Your comment is valuable, but easy to miss. – Slipp D. Thompson Jan 28 '14 at 00:50
  • For Atom, it's `[ \t]+$` – Zhanwen Chen Jul 06 '21 at 18:25
38

To remove trailing whitespace while also preserving whitespace-only lines, you want the regex to only remove trailing whitespace after non-whitespace characters. So you need to first check for a non-whitespace character. This means that the non-whitespace character will be included in the match, so you need to include it in the replacement.

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

Replacement: \1 or $1, depending on the IDE

KOVIKO
  • 1,349
  • 1
  • 17
  • 26
19

The platform is not specified, but in C# (.NET) it would be:

Regular expression (presumes the multiline option - the example below uses it):

    [ \t]+(\r?$)

Replacement:

    $1

For an explanation of "\r?$", see Regular Expression Options, Multiline Mode (MSDN).

Code example

This will remove all trailing spaces and all trailing TABs in all lines:

string inputText = "     Hello, World!  \r\n" +
                   "  Some other line\r\n" +
                   "     The last line  ";
string cleanedUpText = Regex.Replace(inputText,
                                     @"[ \t]+(\r?$)", @"$1",
                                     RegexOptions.Multiline);
Community
  • 1
  • 1
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
4

Regex to find trailing and leading whitespaces:

^[ \t]+|[ \t]+$
Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
mohanish
  • 41
  • 1
3

If using Visual Studio 2012 and later (which uses .NET regular expressions), you can remove trailing whitespace without removing blank lines by using the following regex

Replace (?([^\r\n])\s)+(\r?\n)

With $1

Enter image description here


Some explanation

The reason you need the rather complicated expression is that the character class \s matches spaces, tabs and newline characters, so \s+ will match a group of lines containing only whitespace. It doesn't help adding a $ termination to this regex, because this will still match a group of lines containing only whitespace and newline characters.

You may also want to know (as I did) exactly what the (?([^\r\n])\s) expression means. This is an Alternation Construct, which effectively means match to the whitespace character class if it is not a carriage return or linefeed.

Alternation constructs normally have a true and false part,

(?( expression ) yes | no )

but in this case the false part is not specified.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Rob
  • 1,472
  • 12
  • 24
3

[ |\t]+$ with an empty replace works.

\s+($) with a $1 replace also works, at least in Visual Studio Code...

Mark
  • 143,421
  • 24
  • 428
  • 436
Charles Goodwin
  • 584
  • 5
  • 8
0

To remove trailing white space while ignoring empty lines I use positive look-behind:

(?<=\S)\s+$

The look-behind is the way go to exclude the non-whitespace (\S) from the match.

Andreas
  • 5,393
  • 9
  • 44
  • 53
Markus Strauss
  • 1,032
  • 11
  • 8
0

To remove any blank trailing spaces use this:

\n|^\s+\n

I tested in the Atom and Xcode editors.

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Oskar
  • 2,522
  • 32
  • 37
0

Strangely, I could not get the /[\t ]+$/m to work in PHP. I tried variants of the other answers here, but still failed.

So, I went with this replacement instead:

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

In Java:



String str = "    hello world  ";

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


-4

You can simply use it like this:

var regex = /( )/g;

Sample: click here

Peter Mortensen
  • 30,738
  • 21
  • 105
  • 131
Kumaresan Sd
  • 1,399
  • 4
  • 16
  • 34