如何使用正则表达式删除尾随空格?

Posted

技术标签:

【中文标题】如何使用正则表达式删除尾随空格?【英文标题】:How do I remove trailing whitespace using a regular expression? 【发布时间】:2012-03-20 21:35:42 【问题描述】:

我想从我的代码中删除尾随空格和制表符 删除空行。

我试过了:

\s+$

和:

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

但他们也都删除了空行。我猜\s 也匹配行尾字符。


更新(2016 年):

现在,我使用 Sublime 的 TrailingSpaces 包自动执行此类代码清理,并带有自定义/用户设置:

"trailing_spaces_trim_on_save": true

它突出显示尾随空格并在保存时自动修剪它们。

【问题讨论】:

你的猜测是正确的。 \s 匹配各种空白字符。 对应的Vi和Vim问题是What's the simplest way to strip trailing whitespace from all lines in a file? 这里有一个doc entry 主题。 @Filipp W:对于 Vim 【参考方案1】:

尝试只删除尾随空格和制表符:

[ \t]+$

【讨论】:

如何排除仅包含空格、制表符或它们的混合的行? @DanielF。 ([^ \t])[ \t]+$,但您必须替换为 \1 而不是空字符串。 @DanielF。我发布的正则表达式查找空格字符之前的非空格字符,并使用 \1 替换保留非空格字符。仅包含空格字符的行将与此正则表达式不匹配,将被跳过。 @DanielF。就我而言,我使用的是文本编辑器 (Notepad++),它将每一行都计为一个字符串,而不是将整个文档计为一个字符串。因此,换行符被忽略。要处理不忽略换行符的情况,只需将它们添加到正则表达式:([^ \t\r\n])[ \t]+$ @Koviko:由于您的评论是问题的正确解决方案,而您评论的答案不是,我建议您将该正则表达式作为单独的答案发布。您的评论很有价值,但很容易错过。【参考方案2】:

要删除尾随空格同时保留纯空格行,您希望正则表达式仅删除尾随空格 非空白字符。所以你需要首先检查一个非空白字符。这意味着非空白字符将包含在匹配中,因此您需要将其包含在替换中。

正则表达式: ([^ \t\r\n])[ \t]+$

替换: \1$1,取决于 IDE

【讨论】:

太棒了。谢谢你。此外,同样的正则表达式技术被修改为使用后向断言:(?<![ \t\r\n])[ \t]+$(替换模式应该只是空白)。 什么平台用“\1”代替? @PeterMortensen Notepad++,仅此而已。 @PeterMortensen sed 也是。 这是 Notepad++ 的内置功能:菜单 编辑空白操作修剪尾随空格跨度> 【参考方案3】:

没有指定平台,但在 C# (.NET) 中它是:

正则表达式(假定the multiline option - 下面的示例使用它):

    [ \t]+(\r?$)

替换

    $1

有关“\r?$”的解释,请参阅 Regular Expression Options, Multiline Mode (MSDN)。

代码示例

这将删除所有行中的所有尾随空格和所有尾随 TAB:

string inputText = "     Hello, World!  \r\n" +
                   "  Some other line\r\n" +
                   "     The last line  ";
string cleanedUpText = Regex.Replace(inputText,
                                     @"[ \t]+(\r?$)", @"$1",
                                     RegexOptions.Multiline);

【讨论】:

其他两个答案中的正则表达式在 .NET 中不起作用(它们不会导致任何替换 - 文本保持不变)。 这也适用于 Xcode 和 Swift。竖起大拇指。谢谢。【参考方案4】:

正则表达式查找尾随和前导空格:

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

【讨论】:

你能提供一些上下文吗?你在哪里以及如何测试它?【参考方案5】:

如果使用 Visual Studio 2012 及更高版本 (which uses .NET regular expressions),您可以使用以下正则表达式删除尾随空格而不删除空行

替换(?([^\r\n])\s)+(\r?\n)

$1


一些解释

您需要相当复杂的表达式的原因是字符类\s 匹配空格、制表符和换行符,因此\s+ 将匹配一组仅包含空格的行。向这个正则表达式添加一个$ 终止没有帮助,因为这仍然会匹配一组只包含空格和换行符的行。

您可能还想知道(和我一样)(?([^\r\n])\s) 表达式的确切含义。这是一个Alternation Construct,如果它不是回车符或换行符,它实际上意味着匹配空白字符类。

交替构造通常具有真假部分,

(?( expression ) yes | no )

但在这种情况下,未指定 false 部分。

【讨论】:

【参考方案6】:

[ |\t]+$ 替换为空即可。

\s+($)$1 替换也可以,至少在 Visual Studio Code 中...

【讨论】:

【参考方案7】:

为了在忽略空行的同时删除尾随空格,我使用了积极的后视:

(?<=\S)\s+$

后视是从匹配中排除非空白 (\S) 的方法。

【讨论】:

这匹配空行。匹配将在非空行的末尾开始,但将包括后面的任何空行。 你用的是什么平台? Perl?【参考方案8】:

要删除任何尾随空格,请使用以下命令:

\n|^\s+\n

我在Atom 和Xcode 编辑器中进行了测试。

【讨论】:

你用了什么替换字符? $1?还是别的什么? 一个空字符串作为替换?【参考方案9】:

在 Java 中:



String str = "    hello world  ";

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


【讨论】:

OP 不想删除前导空格。【参考方案10】:

你可以像这样简单地使用它:

var regex = /( )/g;

示例:click here

【讨论】:

嗨@PeterMortensen,它将删除所有空格 问题是什么?

以上是关于如何使用正则表达式删除尾随空格?的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式匹配标签内容,同时省略前导和尾随空格

正则表达式删除字符前字符串中间的空格

正则表达式前导和尾随空格

前导和尾随空格剪切 + 中间空格替换

使用尾随数字的正则表达式信用卡匹配

删除json字符串c#中的尾随空格