僅保留字符串中的數字和小數分隔符
一、概述
假設我們需要從包含字母數字和特殊字符的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 8 Stream
使用 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 刪除所有非數字字符但在 Java String
中保留小數點分隔符,我們將使用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. 結論
在本文中,我們探索了四種不同的方法來從 Java String
中刪除所有非數字字符,同時保留小數點分隔符。
像往常一樣,這裡提供的所有代碼片段都可以在 GitHub 上找到。