1.概述

方法String.trim()删除尾随和前导空格。但是,不支持仅执行L-Trim或R-Trim。

在本教程中,我们将看到一些实现此目标的方法。最后,我们将比较它们的性能。

2. while循环

最简单的解决方案是使用几个while循环遍历字符串

对于L-Trim,我们将从左至右读取字符串,直到遇到非空白字符为止:

int i = 0;
while (i < s.length() && Character.isWhitespace(s.charAt(i))) {i++;
}
String ltrim = s.substring(i);

ltrim是从第一个非空白字符开始的子字符串。

对于R-Trim,我们将从右到左读取字符串,直到遇到非空白字符:

int i = s.length()-1;
while (i >= 0 && Character.isWhitespace(s.charAt(i))) {i--;
}
String rtrim = s.substring(0,i+1);

rtrim是一个子字符串,从第一个非空白字符的开头开始到结尾。

3. String.replaceAll使用正则表达式

另一个选择是使用String.replaceAll()和一个正则表达式:

String ltrim = src.replaceAll("^\\s+", "");
String rtrim = src.replaceAll("\\s+$", "");

(\\ s +)是与一个或多个空格字符匹配的正则表达式。正则表达式开头和结尾的插入符号(^)和($)与行的开头和结尾匹配。

4. Pattern.compile().matcher()

我们也可以使用java.util.regex.Pattern重用正则表达式:

private static Pattern LTRIM = Pattern.compile("^\\s+");
private static Pattern RTRIM = Pattern.compile("\\s+$");String ltrim = LTRIM.matcher(s).replaceAll("");
String rtim = RTRIM.matcher(s).replaceAll("");

5. Apache Commons

此外,我们可以利用Apache Commons StringUtils#stripStart#stripEnd方法来删除空格。

为此,我们首先添加的 公地lang3 依赖性:

<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.11</version>
</dependency>

根据文档,我们使用null来去除空格:

String ltrim = StringUtils.stripStart(src, null);
String rtrim = StringUtils.stripEnd(src, null);

6.Guava

最后,我们将利用Guava CharMatcher#trimLeadingFrom#trimTrailingFrom 方法获得相同的结果。

再次,让我们添加适当的Maven依赖项,这次是guava

<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>28.2-jre</version>
</dependency>

在Guava中,它与Apache Commons中的实现方法非常相似,只是使用了更具针对性的方法:

String ltrim = CharMatcher.whitespace().trimLeadingFrom(s);
String rtrim = CharMatcher.whitespace().trimTrailingFrom(s);

7.性能比较

让我们看看这些方法的性能。像往常一样,我们将使用开源框架Java Microbenchmark Harness(JMH)来比较不同的替代方案(以纳秒为单位)。

7.1。基准设定

对于基准测试的初始配置,我们使用了五个分叉和平均时间计算时间(以纳秒为单位):

@Fork(5)
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)

在设置方法中,我们正在初始化原始消息字段和生成的字符串以与以下内容进行比较:

@Setup
public void setup() {src = "       White spaces left and right          ";ltrimResult = "White spaces left and right          ";rtrimResult = "       White spaces left and right";
}

所有基准测试首先删除左空格,然后删除右空格,最后将结果与预期字符串进行比较。

7.2。while循环

对于我们的第一个基准测试,让我们使用while循环方法:

@Benchmark
public boolean whileCharacters() {String ltrim = whileLtrim(src);String rtrim = whileRtrim(src);return checkStrings(ltrim, rtrim);
}

7.3。具有正则表达式的String.replaceAll() 

然后,让我们尝试String.replaceAll()

@Benchmark
public boolean replaceAllRegularExpression() {String ltrim = src.replaceAll("^\\s+", "");String rtrim = src.replaceAll("\\s+$", "");return checkStrings(ltrim, rtrim);
}

7.4。Pattern.compile()。matches()

之后是Pattern.compile()。matches()

@Benchmark
public boolean patternMatchesLTtrimRTrim() {String ltrim = patternLtrim(src);String rtrim = patternRtrim(src);return checkStrings(ltrim, rtrim);
}

7.5。阿帕奇共享区

第四,Apache Commons:

@Benchmark
public boolean apacheCommonsStringUtils() {String ltrim = StringUtils.stripStart(src, " ");String rtrim = StringUtils.stripEnd(src, " ");return checkStrings(ltrim, rtrim);
}

7.6。番石榴

最后,让我们使用番石榴:

@Benchmark
public boolean guavaCharMatcher() {String ltrim = CharMatcher.whitespace().trimLeadingFrom(src);String rtrim = CharMatcher.whitespace().trimTrailingFrom(src);return checkStrings(ltrim, rtrim);
}

7.7。结果分析

我们应该得到一些类似于以下内容的结果:

# Run complete. Total time: 00:16:57Benchmark                               Mode  Cnt     Score    Error  Units
LTrimRTrim.apacheCommonsStringUtils     avgt  100   108,718 ±  4,503  ns/op
LTrimRTrim.guavaCharMatcher             avgt  100   113,601 ±  5,563  ns/op
LTrimRTrim.patternMatchesLTtrimRTrim    avgt  100   850,085 ± 17,578  ns/op
LTrimRTrim.replaceAllRegularExpression  avgt  100  1046,660 ±  7,151  ns/op
LTrimRTrim.whileCharacters              avgt  100   110,379 ±  1,032  ns/op

看来我们的赢家是while循环,Apache Commons和Guava!

8.结论

在本教程中,我们研究了在String的开头和结尾处删除空格字符的几种不同方法。

我们使用while循环,String.replaceAll(), Pattern.matcher()。replaceAll(), Apache Commons和Guava来获得此结果。

与往常一样,该代码可在GitHub上获得。

Java中实现删除左侧空格ltrim和删除右侧空格rtrim相关推荐

  1. 【小家java】Java中集合List、Set、Map删除元素的方法大总结(避免ConcurrentModificationException异常)

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  2. java中特殊符号怎么校验_校验中文、空格和特殊符号的方法

    开发中经常校验输入的文字合法性,中文.空格和特殊符号等.总结一下这些问题的校验方法: 1)中文 js实现: function ischinese(str){ if(/[^\x00-\xff]/g.te ...

  3. 在java中如何对数组实现添加、删除和插入操作呢?

    我们知道,在C语言和java当中都是一种十分重要的数据结构,但是熟悉数组的朋友都知道,数组一旦被赋值就很难被轻易改动,相比之下人们往往更偏向另一种类似于数组当中但比数组更灵活的集合类型.但是,爱挑战的 ...

  4. java中添加文本框_Java 添加、删除Word文档中的文本框

    在Word文档中,文本框是指一种可移动.可调大小的文字或图形容器.使用文本框,能够使文档在内容和形式上更为饱满.本文将通过使用Java编程来演示如何添加.删除Word文档中的文本框. Jar文件获取及 ...

  5. java中递归删除_浅谈Java中使用递归方法删除文件

    要在Java中平台无关的方式下安全地删除一个非空目录,你还需要一个算法.该算法首先删除文件,然后再从目录树的底部由下至上地删除其中所有的目录. 只要简单地在目录中循环查找文件,再调用delete就可以 ...

  6. 在Java中从字符串中删除空格

    我有一个像这样的字符串: mysz = "name=john age=13 year=2001"; 我想删除字符串中的空格. 我试过trim()但这只删除了整个字符串前后的空格. ...

  7. Java中删除String中空格的多种方法

    在Java中,要实现删除String中的空格的方法有很多种,具体有: 1. trim() 删除字符串开头和结尾的空格,Java 1版本引入的接口,这是开发人员最常用的方法.trim移除的空白字符指的是 ...

  8. JAVA中循环删除list中元素的方法总结

    原文:http://www.cnblogs.com/aspirant/p/7900854.html 印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天 ...

  9. java类怎么删除对象_在java中删除一个对象?

    在java中删除一个对象? 我想删除一个我创build的对象(跟随着你的一个椭圆),但是我怎么做呢? delete follower1; 没有工作. 编辑: 好吧,我会给更多的上下文. 我正在制作一个 ...

最新文章

  1. matplotlib将图绘制在多福图中
  2. Vim清除最后一个搜索突出显示
  3. GridView列行操作
  4. 详解android gatekeeper/fingerprint中的authToken
  5. 使用用户自定义类型作为map的key
  6. 分支限界法:单源最短路径--dijkstra算法
  7. chrome 开发者工具,查看元素 hover 样式
  8. 小议传统分层与新式分层,抑或与DDD分层
  9. Tensorflow深度学习应用(进阶篇)-1
  10. 微软首款 Office 应用程序登陆 Linux
  11. HDU1253 胜利大逃亡【BFS】
  12. 软件测试技术——覆盖方法介绍
  13. 分屏 投影显示 PPT
  14. 自学编程的难度如何?
  15. 局域网中的通信子网和资源子网
  16. android wps页面设置背景图片,wps word怎么设置背景图片
  17. DSP CCS12.00 芯片:TMS320F28335 结课设计 数字电压表 TFTLCD 模块 + ADC 模块
  18. AtCoder - agc005_b(单调栈)
  19. python古典问题兔子问题_古典兔子问题
  20. sse——字符串数组

热门文章

  1. PTA 10-52 查询姓‘李’的学生记录
  2. XENIRO 讯琥科技应用案例(二)| 5G+边缘计算为云游戏赋能
  3. Linux基础(超级无敌认真好用,万字收藏篇!!!!)
  4. 机器人绘画大赛作品一览,一点都不人工智障
  5. 《蚂蚁金服11.11:支付宝和蚂蚁花呗的技术架构及实践》阅读笔记
  6. Android 8.1 Doze模式分析(一)
  7. C#开发微信公众号(3)---创建菜单
  8. 人工智能+停车对于建设智慧城市而言是非常重要的一方面
  9. 慧通教育——python进阶习题第二关(二)
  10. android lifecycle,Android LifeCycle原理分析