如何在Java中删除所有空格

134

我有一个编程任务,其中一部分要求我编写代码以从用户读取一行并删除该行中的所有空格。

这一行可以由一个或多个单词组成。

我尝试使用这个程序分析每个字符,直到找到一个空格,并将该子字符串保存为第一个标记。然后再循环,直到达到没有更多的标记或行末。

当我尝试编译它时,我一直得到这个错误:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index   out of range: 1
    at java.lang.String.charAt(String.java:694)
    at trim.main(trim.java:23)

这里是代码

import java.util.Scanner ;
import java.lang.Character;
import java.lang.String ;
public class trim
{
        public static void main (String[]args)
        {

        String a  ;
        String b  ;
        String c ;
        char aChar ;
        int i = 0 ;

        Scanner scan = new Scanner(System.in);

        a = scan.nextLine();
        a =a.trim() ;


         for ( ; i >= 0 ; i++ )
         {
           aChar = a.charAt(i) ;
           if (aChar != 32)
           {
            a = a.substring(0,i+1);
           }
           else
           {
            b = a.substring(i,160) ;
            b= b.trim();
            c = c + a ;
            c = c.trim() ;
            a = b ;
            i = 0 ;
           }
           if (b.equals(null))
           {
            i = -1 ;
           }
         }
        }
}

希望有更简单的方法,但我仍想让这个程序正常工作。

输入中不能使用哨兵。


感谢大家所有的帮助,

我将使用更简单的方法,并阅读 Java 文档。


4
在 "substring" 中的功能与 "substr" 不同。 - kaysush
3
你需要从《Head First Java(中文版)》这本书中寻求帮助。尽快阅读它。 - AmitG
谢谢,我猜告诉我使用substr的网站是错的。 - Aiman Kh
2
你考虑过阅读Javadoc吗? - user207421
请考虑阅读Java命名规范 - http://java.about.com/od/javasyntax/a/nameconventions.htm - R9J
使用 a.replaceAll("\\p{Blank}",""),它将从字符串中删除所有空格和制表符。 - CoderSam
14个回答

236

java.lang.String类有一个名为substring的方法,而不是substr,这是您程序中的错误。

此外,如果您使用正则表达式没有问题,您可以在一行代码中完成此操作。

a.replaceAll("\\s+","");

3
使用replaceAll时,正则表达式中的“+”选择器是必需的吗? - Kevin Bowersox
6
不是必需的,但如果用户输入了超过一个空格,那么此代码片段将处理这种情况。 - kaysush
17
即使没有加号 +,多个空格也将被删除,因为它们会逐个匹配并被一一删除。 - Lii
1
replaceAll("\\p{Blank}","") 也可以使用,因为它会从字符串中删除所有空格和制表符。 - CoderSam

77

为什么不使用正则表达式呢?

a = a.replaceAll("\\s","");
在正则表达式的上下文中,\s将删除任何空格字符(包括空格、制表符等)。在Java中需要转义反斜杠,以便正则表达式变为\\s。另外,由于字符串是不可变的,所以很重要将正则表达式的返回值分配给a

2
我认为 a.replaceAll("\\s+","") 会稍微快一些。 - roottraveller
5
为什么会更快? - Wackaloon
我认为“+”表示一个或多个出现的意思。 - the.lotuseater

66

最直观的方法是不使用字面值正则表达式

yourString.replaceAll(" ","");

你说得对。有道理。为什么你认为“\s”更可取? - moo cow
1
它们是相同的。使用" "更直观,因为新手可能不知道\s的字面含义。 - Rudziankoŭ
@Rudziankoŭ 他们是吗?" "不仅匹配空格,还匹配所有空白字符吗? - Enerccio
@Enerccio,没错!但是 replaceAll 意味着它将应用于字符串中的所有字符。 - Rudziankoŭ
@Rudziankoŭ但是提问者要求空格," "是不正确的,应该是\s,对吗? - Enerccio
因为这个答案是错误的,它只展示了如何删除一个空格而不是所有的空白字符,所以被踩了。ISO/IEC/IEEE 24765:2010,术语3.3322将空白字符定义为:“1.嵌入在自由文本块中的非显示格式字符。IEEE Std 1320.21998 (R2004) IDEF1X97(IDEFobject)概念建模语言语法和语义的IEEE标准。3.1.210” - Pétur Ingi Egilsson

25

将字符串中的所有空格替换为空字符。

String lineWithoutSpaces = line.replaceAll("\\s+","");

17

试一试:

String str = "Your string with     spaces";
str = str.replace(" " , "");

2
我猜这个不能用制表符运行。 - Nitram76
1
这里涵盖了有关在Java中从字符串中去除空格的选项卡答案。https://dev59.com/2W035IYBdhLWcg3wYO51 - toidiu
因为这个答案是错误的,它只展示了如何删除一个空格而不是所有的空白字符,所以被踩了。ISO/IEC/IEEE 24765:2010,术语3.3322将空白字符定义为:“1.嵌入在自由文本块中的非显示格式字符。IEEE Std 1320.21998 (R2004) IDEF1X97(IDEFobject)概念建模语言语法和语义的IEEE标准。3.1.210” - Pétur Ingi Egilsson

15

尝试:

  string output = YourString.replaceAll("\\s","")

s - 表示空格字符(制表符等)


10
public static String removeSpace(String s) {
    String withoutspaces = "";
    for (int i = 0; i < s.length(); i++) {
        if (s.charAt(i) != ' ')
            withoutspaces += s.charAt(i);

    }
    return withoutspaces;

}

这是从字符串中删除空格最简单和最直接的方法。


7
package com.infy.test;

import java.util.Scanner ;
import java.lang.String ;

public class Test1 {


    public static void main (String[]args)
    {

        String a  =null;


        Scanner scan = new Scanner(System.in);
        System.out.println("*********White Space Remover Program************\n");
        System.out.println("Enter your string\n");
    a = scan.nextLine();
        System.out.println("Input String is  :\n"+a);


        String b= a.replaceAll("\\s+","");

        System.out.println("\nOutput String is  :\n"+b);


    }
}

4

你可以使用String.replace(" ", "");来实现吗?


这不是最简单的方法吗? - aashima
1
因为这个答案是错误的,它只展示了如何删除一个空格而不是所有的空白字符,所以被踩了。ISO/IEC/IEEE 24765:2010,术语3.3322将空白字符定义为:“1.嵌入在自由文本块中的非显示格式字符。IEEE Std 1320.21998 (R2004) IDEF1X97(IDEFobject)概念建模语言语法和语义的IEEE标准。3.1.210” - Pétur Ingi Egilsson

3
String a="string with                multi spaces ";
//or this 
String b= a.replaceAll("\\s+"," ");

String c= a.replace("    "," ").replace("   "," ").replace("  "," ").replace("   "," ").replace("  "," ");

//它可以正常处理任何空格

*不要忘记在字符串b中加入空格


使用[编辑]链接编辑您的答案,而不是发布新答案。 - Jeffrey Bosboom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接