string是Java中最常用的数据类型。我们在日常开发中经常会用到字符串来做很多操作。比如字符串的拼接、截断、替换等。本文介绍一个比较常见又容易被忽视的操作,就是去掉字符串中的空格。实际上,在Java中有很多不同的方法可以从字符串中删除空格,例如trim、replaceAll等。但是,Java11中添加了一些新功能,例如strip、stripLeading、stripTrailing等。大多数时候,我们只是使用trim方法删除多余的空格。但是好像很多人都没有想过,有没有更好的办法呢?当然,trim()在大多数情况下都能很好地工作,但是在Java中有许多不同的方法。每个都有自己的优点和缺点。我们如何决定哪种方法最适合我们?下面介绍几种方法,并比较它们的区别和优缺点等。根据经验,笔者总结了以下7种方法(JDK原生方法,第三方实用类库中不包含类似方法):trim():去除字符串首尾空格。strip():删除字符串开头和结尾的空格。stripLeading():只删除字符串开头的空格stripTrailing():只删除字符串末尾的空格replace():用新字符替换所有目标字符replaceAll():用新字符替换所有匹配字符。该方法以正则表达式作为输入,用于识别需要替换的目标子串replaceFirst():仅将第一次出现的目标子串替换为新字符串最需要注意的是,Java中的String对象是不可变的,也就是说我们不能修改字符串,所以上面的方法我们得到的都是一个新的字符串。下面我们就来研究一下以上几种方法的用法,了解一下它们的特点。PS:本文代码是使用在线运行工具(https://www.jdoodle.com/online-java-compiler/)执行的,因为我的测试机没有安装Java11,Unicode字符没有完全的。如果你也想实验,建议使用在线工具,选择对应的JDK。trimtrim()是Java开发人员最常用的删除字符串开头和结尾空格的方法。它的用法也比较简单:"\'");StringstringAfterTrim=stringWithSpace.trim();System.out.println("Aftertrim:\'"+stringAfterTrim+"\'");}}输出结果:Beforetrim:'HollisIsAJavaCoder'Aftertrim:'HollisIsAJavaCoder'As上面,使用trim后,去掉了原字符串开头和结尾的空格。但是不知道大家有没有想过,trim方法去掉的空白内容到底包含了什么?除了空格还有其他字符吗?其实trim去除的空白字符是指ASCII值小于等于32的任意字符('U+0020'):包括空格、换行、退格等字符。strip()不知道大家有没有注意到,在Java11的发布中,新增了一个strip()方法,用于去除字符串中的前后空格。已经有trim方法了,为什么还要添加新的strip呢?这其实是因为trim方法只能去掉ASCII值小于等于32的字符,但是按照Unicode标准,除了ASCII中的字符,或者还有很多其他的空白字符。并且为了识别这些空格字符,从Java1.5开始,在Character类中增加了一个新的isWhitespace(int)方法。此方法使用unicode来识别空格字符。您可以在http://jkorpela.fi/chars/spaces.html阅读有关unicode空格字符的更多信息。Java11中新增的strip方法是通过Character.isWhitespace(int)方法判断是否为空白字符并删除:下面看一个使用strip的例子:publicclassStringTest{publicstaticvoidmain(Stringargs[]){StringstringWithSpace='\u2001'+"HollisIsAJavaCoder"+'\u2001';System.out.println("'"+'\u2001'+"'isspace:"+Character.isWhitespace('\u2001'));StringTest.stripTest(stringWithSpace);}privatestaticvoidstripTest(StringstringWithSpace){System.out.println("Beforestrip:\'"+stringWithSpace+"\'");StringstringAfterTrim=stringWithSpace.strip();System.out.println("Afterstrip:\'"+stringAfterTrim+"\'");}}我们在字符串前后加了一个特殊字符\u2001,这个字符不是ASCII,通过Character.isWhitespace判断是空白字符。然后使用strip进行处理,输出结果如下:''isspace:trueBeforestrip:'HollisIsAJavaCoder'Afterstrip:'HollisIsAJavaCoder'所以Java11中的strip方法比trim方法更强大,可以去除很多空白字符不属于ASCII的,判断方法是通过Character.isWhitespace方法。trim和strip方法的区别上面我们介绍了两个可以去除字符串首尾的方法,即trim和strip,然后比较一下它们的区别:stripLeading()和stripTrailing()stripLeading()和stripTrailing()方法也是在Java11中加入的,作用是分别删除字符串开头的空格和字符串结尾的空格。与strip方法类似,stripLeading和stripTrailing也使用Character.isWhitespace(int)来识别空白字符。使用方法也和剥离类:publicclassStringTest{publicstaticvoidmain(Stringargs[]){StringstringWithSpace='\u2001'+"HollisIsAJavaCoder"+'\u2001';System.out.println("'"+'\u2001'+"'isspace:"+Character.isWhitespace('\u2001'));StringTest.stripLeadingTest(stringWithSpace);StringTest.stripTrailingTest(stringWithSpace);}privatestaticvoidstripLeadingTest(StringstringWithSpace){System.out.println("BeforestripLeading:\'"+stringWithSpace+"\'");StringstringAfterTrim=stringWithSpace.stripLeading();System.out.println("AfterstripLeading:\'"+stringAfterTrim+"\'");}privatestaticvoidstripTrailingTest(StringstringWithSpace){System.out.println("BeforestripTrailing:\'"+stringWithSpace+"\'");StringstringAfterTrim=stringWithSpace.stripTrailing();System.out.println("AfterstripTrailing:\'"+stringAfterTrim+"\'");}}输出结果:''isspace:trueBeforestripLeading:'HollisIsAJavaCoder'AfterstripLeading:'HollisIsAJavaCoder'BeforestripTrailing:'HollisIsAJavaCoder'AfterstripTrailing:'HollisIsAJavaCoder'替换删除字符串中的空白字符。除了使用trim和strip,还有一种方法,就是使用replace方法来替换replace中的空白字符,replace是java1.5添加的,可以将每个目标子字符串替换为指定的字符串。此方法使用以下方法替换所有匹配的目标元素:\'"+stringWithSpace+"\'");StringstringAfterTrim=stringWithSpace.replace("","");System.out.println("Afterreplace:\'"+stringAfterTrim+"\'");}}结果:替换前:'HollisIsAJavaCoder'Afterreplace:'HollisIsAJavaCoder'可以看到,字符串中的所有空白字符都可以使用上面的replace方法进行替换。特别地,replace方法和trim方法一样,只能替换ASCII中的空白字符。replaceAllreplaceAll是Java1.4中添加的最强大的字符串操作方法之一。我们可以将这种方法用于多种目的。使用replaceAll()方法,我们可以使用正则表达式来识别需要替换的目标字符内容。使用正则表达式可以实现很多功能,比如删除所有空格、删除开头空格、删除结尾空格等等。我们只需要用正确的替换参数创建正确的正则表达式。一些正则表达式的例子如下:\s+所有空白字符^\s+字符串开头的所有空白字符\s+$字符串结尾的所有空白字符注意在java中要加上/我们必须使用转义字符,所以对于\s+我们必须使用\\s+publicclassStringTest{publicstaticvoidmain(Stringargs[]){StringstringWithSpace="HollisIsAJavaCoder";StringTest.replaceAllTest(stringWithSpace,"");StringTest.replaceAllTest(stringWithSpace,"\\s+");字符串测试。replaceAllTest(stringWithSpace,"^\\s+");StringTest.replaceAllTest(stringWithSpace,"\\s+$");}privatestaticvoidreplaceAllTest(StringstringWithSpace,Stringregex){System.out.println("BeforeplaceAllwith'"+regex+"':\'"+stringWithSpace+"\'");StringstringAfterTrim=stringWithSpace.replaceAll(regex,"");System.out.println("AfterreplaceAllwith'"+regex+"':\'"+stringAfterTrim+"\'");}}结果:BeforereplaceAllwith'':'HollisIsAJavaCoder'AfterreplaceAllwith'':'HollisIsAJavaCoder'BeforeplaceAllwith'\s+':'HollisIsAJavaCoder'AfterreplaceAllwith'\s+':'HollisIsAJavaCoder'BeforeplaceAllwith'^\s+':'HollisIsAJavaCoder'AfterreplaceAllwith'^\s+':'HollisIsAJavaCoder'BeforeplaceAllwith'\s+$':'HollisIsAJavaCoder'AfterreplaceAllwith'\s+$':'HollisIsAJavaCoder'如果如我们所见,使用replaceAll()与适当的正则表达式,将是非常强大的方法replaceFirstjava1.4中还添加了replaceFirst方法,它仅用替换字符串替换给定正则表达式的第一次出现。如果您只需要替换第一个匹配项,此方法很有用。例如,如果我们只需要删除前导空格,我们可以使用\\s+或^\\s+。我们还可以使用此方法通过使用\\s+$正则表达式来删除尾随空格。因为这个表达式只会匹配行的最后一个空格。因此,最终空间被认为是该方法的第一个匹配项。让我们举一个从字符串中删除前导和尾随空格的示例;StringTest.replaceFirstTest(stringWithSpace,"^\\s+");StringTest.replaceFirstTest(stringWithSpace,"\\s+$");}privatestaticvoidreplaceFirstTest(StringstringWithSpace,Stringregex){System.out.println("BeforeplaceFirstwith'"+regex+"':\'"+stringWithSpace+"\'");StringstringAfterTrim=stringWithSpace.replaceFirst(regex,"");System.out.println("AfterreplaceFirstwith'"+regex+"':\'"+stringAfterTrim+"\'");}}结果:BeforereplaceFirstwith'':'HollisIsAJavaCoder'AfterreplaceFirstwith'':'HollisIsAJavaCoder'BeforeplaceFirstwith'\s+':'HollisIsAJavaCoder'AfterreplaceFirstwith'\s+':'HollisIsAJavaCoder'BeforeplaceFirstwith'^':'HollisIsAJavaCoder'BeforeplaceFirstwith'^'llisIsAJavaCoder'AfterreplaceFirstwith'^\s+':'HollisIsAJavaCoder'BeforeplaceFirstwith'\s+$':'HollisIsAJavaCoder'AfterreplaceFirstwith'\s+$':'HollisIsAJavaCoder'总结直接去掉字符串开头的空白字符,可以用stripLeading,replaceAll和replaceFirst直接去除字符串末尾的空白字符,可以使用stripTrailing、replaceAll和replaceFirst去除字符串开头和结尾的空白字符,可以使用strip、trim去除字??符串中的所有空白字符字符串,可以使用replace和replaceAll以及Java11新的strip,stripTrailing和stripLeading方法可以去除比其他方法更多的字符,他可以去除的空白字符不限于ASCII中的字符,而是Unicode中的所有空白字符。具体判断方法可以通过Character.isWhitespace来判断。【本文为专栏作家霍利斯原创文章,作者微信公众号Hollis(ID:hollishuang)】点此阅读更多本作者好文
