问题描述
今天遇到一个比较怪异的问题,这里简单记录一下:
有个需求是需要去掉字符串后面的空格,我这里使用的是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()
⭕关注博主,不迷路 ⭕
创作不易,关注💖、点赞👍、收藏🎉就是对作者最大的鼓励👏,欢迎在下方评论留言🧐