一、概述
假设我们需要从包含字母数字和特殊字符的String
中删除所有非数字字符,同时保留小数分隔符。例如,我们想从“The price of this bag is 100.5$”中提取文本的数字和小数部分,得到“100.5”,即价格部分。
在本教程中,我们将探讨在Java 中执行此操作的四种不同方法。
2.使用正则表达式和String
的replaceAll()
方法
最简单的方法是使用String
类的内置replaceAll()
方法。它用指定的替换替换与提供的正则表达式匹配的文本的每个部分。
replaceAll()
方法有两个参数:正则表达式和替换。
因此,如果我们将相关的正则表达式和一个空字符串作为替换参数传递给方法,就可以达到我们的目的。
为简单起见,我们将定义一个单元测试来验证预期结果:
String s = "Testing abc123.555abc"; s = s.replaceAll("[^\\d.]", ""); assertEquals("123.555", s);
在上面的测试用例中,我们将正则表达式定义为**[^\\d.]
来表示一个否定集合,该集合匹配不在包含任何数字字符(0-9) 和“.”的集合中的任何字符。字符**。
上述测试成功执行,从而验证最终结果仅包含数字字符和小数分隔符。
3. 使用Java 8Stream
使用Java 8 Streams,我们可以在不同的小步骤中定义一系列数据操作:
String s = "Testing abc123.555abc"; StringBuilder sb = new StringBuilder(); s.chars() .mapToObj(c -> (char) c) .filter(c -> Character.isDigit(c) || c == '.') .forEach(sb::append); assertEquals("123.555", sb.toString());
首先,我们创建了一个StringBuilder
实例来保存最终结果。然后,我们使用chars()
方法遍历String
中的各个字符,该方法返回int
流,本质上是字符代码。为了处理这种情况,我们使用了一个映射函数mapToObj()
,它返回一个Character
Stream
。
最后,我们使用filter()
方法仅选择那些是数字或小数点的字符。
4. 使用外部库
我们还可以通过将Guava 和Apache Commons 等外部库集成到我们的代码库中来解决我们的问题。我们可以利用这些库中提供的预定义实用程序类。
4.1。番石榴
要使用Guava 删除所有非数字字符但在JavaString
中保留小数点分隔符,我们将使用CharMatcher
实用程序类中的方法。
要包含Guava
,我们首先需要更新我们的pom.xml
文件:
<dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> <version>31.1-jre</version> </dependency>
接下来,让我们使用CharMatcher
类中的方法重写单元测试:
String s = "Testing abc123.555abc"; String result = CharMatcher.inRange('0', '9') .or(CharMatcher.is('.')) .retainFrom(s); assertEquals("123.555", result);
如果我们运行测试,它会成功执行并返回预期的结果。为了清楚起见,让我们回顾一下我们使用过的方法:
inRange()
方法采用两个char
参数startInclusive
和endInclusive
,并匹配给定范围内定义的字符。or()
方法采用CharMatcher
类型的单个参数。它通过匹配此匹配器或调用它的匹配器的任何字符来返回匹配器。is()
方法采用单个参数,char match.
它只匹配一个指定的字符。retainFrom()
方法采用单个参数CharSequence sequence.
它**从满足指定匹配条件的字符序列中返回字符**。
4.2.阿帕奇公地
在Apache Commons 中,RegExUtils
类**提供了一个简单的方法removeAll(String text, String regex)
来删除所有符合regex 中指定条件的字符**。
要包含Apache Commons Lang
,我们需要更新我们的pom.xml
文件:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
如果我们看一下RegExUtils
类,我们会发现它的removeAll()
方法可以帮助我们解决问题:
String s = "Testing abc123.555abc"; String result = RegExUtils.removeAll(s, "[^\\d.]"); assertEquals("123.555", result);
RegExUtils.removeAll()
需要两个String
参数,text
和regex
。在这里,我们以与上面的String.replaceAll
示例相同的方式定义了regex
。
5. 结论
在本文中,我们探索了四种不同的方法来从JavaString
中删除所有非数字字符,同时保留小数点分隔符。
0 评论