Java 中使用 trim() 无法去除空格的解决方法

文章讲述了在Java编程中遇到的一个问题,即使用String.trim()方法无法去除全角空格和ASCII值为160的不间断空格。文章解释了trim方法的限制,只适用于ASCII值为32的空格。解决方案包括使用正则表达式一次性替换全角、半角和不间断空格,以及使用JDK11引入的String.strip()方法来去除前后的全角和半角空白字符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述

今天遇到一个比较怪异的问题,这里简单记录一下:

有个需求是需要去掉字符串后面的空格,我这里使用的是String.trim()

public class Demo1 {
  public static void main(String[] args) {
    String s1 = "空格测试 ";
    System.out.println(s1.trim());
    // 空格测试
  }
}

到这里是不是完全没问题,但是今天发现输入的数据明明带了空格,结果还是没有去掉,没有得到想要的结果。

原因分析:

首先,使用trim方法去掉首位空格是没有问题的。那为什么会出现上述问题呢?

查阅资料后发现,trim方法只能去掉字符串中的ASCII值为32的空格,即半角空格

全角和半角

在输入法中存在全角和半角字符的概念,比如说“逗号”存在“全角逗号和半角逗号”,体现在Unicode中就是两个不同的码位

全角字符

全角字符占3字节,ASCII值为12288,全角字符不能被trim

ASCII -160 特殊空格

该空格为不间断空格(non-breaking space),占2个字节,即前端页面上的 ,同样也不能被trim

也就是说,trim或者replace只能去掉ASCII值为32的空格,而ASCII值为160或全角的空格是无法通过replace或者trim处理的

解决方案:

方法一:使用正则表达式

ASCII编码是160的空格,Unicode对应是\u00A0,使用replace+UNICODE编码\u00A0替换,全角空格(\u3000),使用replace方法+全角空格字符替换,普通空格,使用replace方法+\s替换,正则表达式.replaceAll("([ ]|\\s|\\u00A0)+","")

如下:

public class Demo1 {
  public static void main(String[] args) {
 		String s2 = "全角空格测试 !!";
        System.out.println(s1.replaceAll("([ ]|\\s|\\u00A0)+",""));
        // 全角空格测试!!
  }
}

方法二:使用String.strip()

我这里的问题是全角空格导致的,所以可以使用String.strip()去除字符串前后的“全角和半角”空白字符

public class Demo1 {
  public static void main(String[] args) {
    String s3 = "吃了没\u3000";
    System.out.println(s3.trim().length());
    System.out.println(s3.strip().length());
    // 4 3
    System.out.println(s3.strip());
    // "吃了没"
  }

🔻注意:JDK11中引入String.strip()

⭕关注博主,不迷路 ⭕

创作不易,关注💖、点赞👍、收藏🎉就是对作者最大的鼓励👏,欢迎在下方评论留言🧐

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.猫的树

你的鼓励就是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值