Java 如何在字符串中用单个空格替换 2 个或更多空格,并删除前导空格和尾随空格

2022-08-31 04:59:26

在Java中寻找快速,简单的方法来更改此字符串

" hello     there   "

到看起来像这样的东西

"hello there"

其中,我将所有这些多个空格替换为单个空格,除了我还希望字符串开头的一个或多个空格消失。

像这样的东西让我部分地在那里

String mytext = " hello     there   ";
mytext = mytext.replaceAll("( )+", " ");

但不完全是。


答案 1

试试这个:

String after = before.trim().replaceAll(" +", " ");

另请参见


无正则表达式trim()

也可以只用一个来做到这一点,但这比解决方案的可读性要差得多。尽管如此,这里提供它只是为了显示正则表达式可以做什么:replaceAlltrim()

    String[] tests = {
        "  x  ",          // [x]
        "  1   2   3  ",  // [1 2 3]
        "",               // []
        "   ",            // []
    };
    for (String test : tests) {
        System.out.format("[%s]%n",
            test.replaceAll("^ +| +$|( )+", "$1")
        );
    }

有 3 个备选方案:

  • ^_+:字符串开头的任何空格序列
    • 匹配并替换为 ,这将捕获空字符串$1
  • _+$:字符串末尾的任何空格序列
    • 匹配并替换为 ,这将捕获空字符串$1
  • (_)+:任何与上述内容都不匹配的空格序列,这意味着它位于中间
    • 匹配并替换为 ,捕获单个空格$1

另请参见


答案 2

您只需要一个:

replaceAll("\\s{2,}", " ").trim();

其中,您匹配一个或多个空格并将其替换为单个空格,然后在开头和结尾修剪空格(实际上,您可以通过首先修剪然后匹配来反转,以使正则表达式更快,正如有人指出的那样)。

要快速测试这一点,请尝试:

System.out.println(new String(" hello     there   ").trim().replaceAll("\\s{2,}", " "));

它将返回:

"hello there"