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.
In Java:
You can use the regex
/^[ \t\v\f]+\S.*$/gm
to remove leading whitespace of each line, without touching blank lines nor trailing whitespace:If you want more robust support although a bit slower, use the regex
/^[ \t\v\f\xA0\uFEFF]+(\S.*)$/gm
, which includes NBSP and BOM, making it closer to the\s
behavior.ADDED:
This is more simple and compliant with the
\s
behavior:/^(?=\s+).+(\S.*)$/gm
...but I don't know if it will work in older browsers.WARNING: Any solution based on a simple regex can break ES6 TL strings.
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
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.
To remove trailing white space while ignoring empty lines I use positive look-behind:
The look-behind is the way go to exclude the non-whitespace (\S) from the match.
Try just removing trailing spaces and tabs:
The platform is not specified, but in C# (.NET) it would be:
Regular expression (presumes the multiline option - the example below uses it):
Replacement:
For an explanation of "\r?$", see Regular Expression Options, Multiline Mode (MSDN).
Full code example
This will remove all trailing spaces and all trailing TABs in all lines: