在Java中从字符串中删除空格的不同方法

简介: 在Java中从字符串中删除空格的不同方法

前言

技术不进则退,学无止境。

今天,我们来聊一下,字符串是如何剔除掉空格的。因为在很多时候,会用到这个功能。

字符串操作在编程时是最普通的操作。其中一个比较频繁的操作就是删除字符串文本中或字符串周围的空格。Jdk11 之前,我们都知道在Java中从字符串中删除空格的不同方法,即trim,replaceAll。但是,Java 11通过诸如strip,stripLeading和stripTrailing之类的方法对这些方法进行了一些新的添加。

在大多数情况下,我们只使用trim方法删除空格。是否有更好的方法来满足我们的需求?当然,trim()在大多数情况下都能很好地工作,但是java中有许多不同的方法。每种都有自己的优点和缺点。我们如何决定哪种方法最适合我们?

在Java中从字符串中删除空格的不同方法

总结了下,大概分为以下的方法:

  1. trim() :从字符串中删除前导和尾随空格
  2. strip() :删除字符串开头和结尾的空格。Strip方法支持Unicode字符集
  3. trim vs  strip:trim与strip方法之间的差异
  4. stripLeading() :仅从字符串开头删除空格
  5. stripTrailing() :仅从字符串末尾删除空格
  6. replace() :用新字符替换所有目标字符
  7. replaceAll() :将所有匹配的字符替换为新字符。此方法将正则表达式作为输入,以标识需要替换的目标子字符串
  8. replaceAll vs replace :replace和replaceAll方法之间的区别
  9. replaceFirst() :仅使用新替换字符串替换第一次出现的目标子字符串

需要注意的最重要一点是,在Java中,字符串对象是不可变的。这意味着我们无法修改字符串,因此所有方法都将通过所有转换返回新字符串。

Java中的trim()方法

trim()是用来从字符串中提出前后空格最常用的操作方法。方法能够操作ASCII 值小于等于32 (‘U+0020’)的字符

public class StringTrimTest {
   public static void main(String[] args) {
       String string = "   String   with   space   ";
       System.out.println("格式化前: \"" + string +"\"");
       System.out.println("格式化后: \"" + string.trim() +"\"");
  }
}

执行程序,输出结果:

格式化前: "   String   with   space   "
格式化后: "String   with   space"

jdk11,Java中的strip()方法

在Java 11发行版中,添加了新的strip()方法,以从String中删除前和后空格。

添加此方法的原因是,根据Unicode标准,存在各种空格字符,其ASCII值大于32('U + 0020')。例如:8193(U + 2001)。

为了识别这些空格字符,新方法是Java 1.5在Character类中添加了Whitespace(int)。此方法使用unicode识别空格字符。您可以在此处阅读有关Unicode空格字符的更多信息。

strip使用此Character.is Whitespace(int)方法覆盖范围广泛的空白字符并将其删除。

public class StringStripTest {
   public static void main(String[] args) {
       String string = "   String   with   space   ";
       System.out.println("格式化前: \"" + string+"\"");
       System.out.println("格式化后: \"" + string.strip()+"\"");
  }
}

执行程序,输出结果:

格式化前: "   String   with   space   "
格式化后: "String   with   space"

strip vs trim

trim() strip()
自 Java 1 自 Java 11
使用(ASCII) 值 使用Unicode 值
移除首尾空格 移除首尾空格
移除ASCII码小于等于‘U+0020’ 或’32’空格字符 移除所有满足unicode的空格字符

让我们看一下示例,我们将使用大于32('U + 0020')unicode的空白字符。

public class StringTrimVsStripTest {
   public static void main(String[] args) {
       String string = '\u2001'+"String   with   space"+ '\u2001';
       System.out.println("格式化前: \"" + string+"\"");
       System.out.println("trim 格式化后: \"" + string.trim()+"\"");
       System.out.println("strip 格式化后: \"" + string.strip()+"\"");
  }
}

执行程序,输出结果:

格式化前: " String   with   space "
trim 格式化后: " String   with   space "
strip 格式化后: "String   with   space"

在上面的示例中,我们可以看到trim方法无法删除'\ u2001'unicode字符添加的空格字符。

注意:如果您在Windows计算机上运行,由于设置了有限的unicode,您可能看不到类似的输出。

Jdk11,Java中的stripLeading ( ) 方法

Java 11中添加了strip Leading()方法,以删除字符串中的所有前缀空格。

与strip方法类似,Strip Leading也使用Character.is Whitespace(int)来识别空白。

public class StringStripLeadingTest {
   public static void main(String[] args) {
       String string = "   String   with   space   ";
       System.out.println("格式化前: \"" + string+"\"");
       System.out.println("格式化后: \"" + string.stripLeading()+"\"");
  }
}

执行程序,输出结果:

格式化前: "   String   with   space   "
格式化后: "String   with   space   "

Jdk11,Java中的stripTrailing() 方法

strip Trailing()方法已在Java 11中添加,从字符串中删除了所有后缀空格。

与strip方法类似,Strip Trailing也使用Character.is Whitespace(int)来识别空白。

public class StringStripTrailingTest {
   public static void main(String[] args) {
     String string = "   String   with   space   ";
     System.out.println("格式化前: \"" + string+"\"");
       System.out.println("格式化后: \"" + string.stripTrailing()+"\"");
  }
}

执行程序,输出结果:

格式化前:"   String   with   space   "
格式化后:"   String   with   space"

replace(CharSequence target, CharSequence replacement):

从Java 1.5中添加,此方法用于将每个目标子字符串替换为指定的替换字符串。

此方法替换所有匹配的目标元素。

注意:java字符串类中提供了另一种方法replace(char旧的char,char新的char)。唯一的区别是此方法将单个字符用作目标和替换。我们不能使用此方法来删除空间,因为我们不能使用空字符作为替换。

public class StringReplaceTest {
   public static void main(String[] args) {
       String string = "   String   with   space   ";
       System.out.println("格式化前: \"" + string + "\"");
       System.out.println("格式化后: \"" + string.replace(" ", "") + "\"");
  }
}

执行程序,输出结果:

格式化前: "   String   with   space   "
格式化后: "Stringwithspace"

replaceAll (String regex, String replacement)

在Java 1.4中添加,这是最强大的字符串处理方法之一。我们可以将这种方法用于许多目的。

使用replace All()方法,我们可以使用给定的替换字符串替换每个匹配的正则表达式子字符串。例如,删除所有空格,删除前导空格,删除尾随空格等等。

我们只需要创建带有正确替换参数的正确正则表达式即可。一些正则表达式示例如下:

\s+ 匹配所有的空格
^\s+ 匹配所有开始的空格
\s+$ 匹配所有结束的空格

替换字符串中的空格的示例

注意:在Java中添加“ /”,我们必须使用转义符,因此对于“ \ s +”,我们必须使用“ \ s +”

public class StringReplaceAllTest {
   public static void main(String[] args) {
       String string = "   String   with   space   ";
       System.out.println("replaceAll执行前: \"" + string+"\"");
       System.out.println("替换所有的空格: \"" + string.replaceAll(" ", "") + "\"");
       System.out.println("按正则表达式替换所有的空格: \"" + string.replaceAll("\\s+", "") + "\"");
       System.out.println("按正则表达式替换头的空格: \"" + string.replaceAll("^\\s+", "") + "\"");
       System.out.println("按正则表达式替换尾的空格: \"" + string.replaceAll("\\s+$", "") + "\"");
  }
}

执行程序,输出结果:

replaceAll执行前: "   String   with   space   "
替换所有的空格: "Stringwithspace"
按正则表达式替换所有的空格: "Stringwithspace"
按正则表达式替换头的空格: "String   with   space   "
按正则表达式替换尾的空格:"   String   with   space"

如我们所见,如果我们将其与正确的正则表达式一起使用,则replaceAll()替换功能非常强大。

replaceAll vs replace

replaceAll() replace()
自 Java 1.4 自Java 1.5
接受正则表达式为目标符 接受字符串为目标符
能够进行动态字符串替换 能够进行字符串替换
移除ASCII码小于等于‘U+0020’ 或’32’空格字符 移除所有满足unicode的空格字符

replaceFirst(String regex, String replacement)

Java 1.4中添加了``replaceFirst ''方法,仅将给定正则表达式的第一个匹配替换为替换字符串。

如果您只需要替换一个第一次出现的位置,则此方法非常有用。例如,如果我们只需要删除前导空格,则可以使用“ \ s +”或“ ^ \ s +”。

我们还可以使用此方法通过使用“ \ s + $”正则表达式删除尾随空格。因为此表达式将仅匹配行中的最后空格。因此,最后一个空格被视为此方法的第一个匹配项。

让我们举个例子,从字符串中删除前导和尾随空格

public class StringReplaceFistTest {
     public static void main(String[] args) {
     String string = "   String   with   space   ";
     System.out.println("替换前:\"" + string+"\"");
       System.out.println("替换:\"" + string.replaceFirst("space", "update") + "\"");
       System.out.println("替换头: \"" + string.replaceFirst("\\s+", "") + "\"");
       System.out.println("替换尾:\"" + string.replaceFirst("\\s+$", "") + "\"");   }
}

执行程序,输出结果:

替换前:"   String   with   space   "
替换:"   String   with   update   "
替换头: "String   with   space   "
替换尾:"   String   with   space"
目录
相关文章
|
26天前
|
存储 安全 Java
Java零基础-字符串详解
【10月更文挑战第18天】Java零基础教学篇,手把手实践教学!
99 60
|
16天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
36 6
|
18天前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
66 4
|
29天前
|
Java API
Java 对象释放与 finalize 方法
关于 Java 对象释放的疑惑解答,以及 finalize 方法的相关知识。
48 17
|
22天前
|
Java 测试技术 Maven
Java一分钟之-PowerMock:静态方法与私有方法测试
通过本文的详细介绍,您可以使用PowerMock轻松地测试Java代码中的静态方法和私有方法。PowerMock通过扩展Mockito,提供了强大的功能,帮助开发者在复杂的测试场景中保持高效和准确的单元测试。希望本文对您的Java单元测试有所帮助。
63 2
|
30天前
|
Java 开发者
在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口
【10月更文挑战第20天】在Java多线程编程中,创建线程的方法有两种:继承Thread类和实现Runnable接口。本文揭示了这两种方式的微妙差异和潜在陷阱,帮助你更好地理解和选择适合项目需求的线程创建方式。
20 3
|
30天前
|
Java 开发者
在Java多线程编程中,选择合适的线程创建方法至关重要
【10月更文挑战第20天】在Java多线程编程中,选择合适的线程创建方法至关重要。本文通过案例分析,探讨了继承Thread类和实现Runnable接口两种方法的优缺点及适用场景,帮助开发者做出明智的选择。
19 2
|
30天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
30天前
|
Java 开发者
Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点
【10月更文挑战第20天】Java多线程初学者指南:介绍通过继承Thread类与实现Runnable接口两种方式创建线程的方法及其优缺点,重点解析为何实现Runnable接口更具灵活性、资源共享及易于管理的优势。
34 1
|
24天前
|
Java Spring
JAVA获取重定向地址URL的两种方法
【10月更文挑战第17天】本文介绍了两种在Java中获取HTTP响应头中的Location字段的方法:一种是使用HttpURLConnection,另一种是使用Spring的RestTemplate。通过设置连接超时和禁用自动重定向,确保请求按预期执行。此外,还提供了一个自定义的`NoRedirectSimpleClientHttpRequestFactory`类,用于禁用RestTemplate的自动重定向功能。
下一篇
无影云桌面