假設我有一個串列:
List<String> dest = Arrays.asList(
"abc abd 2000",
"idf owe 1200",
"jks ldg 789",
"ccc hhh 2000",
"www uuu 1000"
);
我正在嘗試獲取每個字串末尾的數字。給定的串列中只有整數,但我也在為雙精度撰寫正則運算式:(\\d \\.?\\d ). 在 Java 1.8 中,我撰寫了以下代碼:
ArrayList<String> mylist = new ArrayList<>(
dest.stream()
.filter(Pattern.compile("\\D \\s\\D \\s(\\d \\.?\\d )").asPredicate())
.collect(Collectors.toList())
);
我想要做的是 -(\\d \\.?\\d )從每個找到的字串中獲取組,我該怎么做?我正在考慮將 aMatcher應用于串列的每個元素,但我不確定如何實作它。
uj5u.com熱心網友回復:
我正在嘗試獲取每個字串末尾的數字...
解決方案 1
也許您可以在不使用正則運算式的情況下解決它,如下所示:
List<String> response = dest.stream()
.map(String::trim)
.map(s -> s.split("\\s "))
.map(r -> r[r.length - 1])
.toList();
解決方案 2
如果你堅持使用正則運算式,你可以使用:
final String regex = "\\D \\s\\D \\s(\\d \\.?\\d )";
final Pattern compile = Pattern.compile(regex);
List<String> response = dest.stream()
.map(compile::matcher)
.filter(Matcher::find)
.map(r -> r.group(1))
.toList();
輸出
[2000.55, 1200, 789, 2000, 1000]
uj5u.com熱心網友回復:
filter保留或洗掉串列中的元素。如果要轉換流元素(在提取數字時執行此操作),請使用map.
然后您可以使用正則運算式(連同 a Matcher)來提取資料:
Pattern p = Pattern.compile("\\D \\s\\D \\s(\\d \\.?\\d )");
List<String> mylist = dest.stream()
.map(s -> {
Matcher matcher = p.matcher(s);
matcher.find();
return matcher.group(1); //error handling sold seperately
})
.collect(Collectors.toList());
System.out.println(mylist);
印刷
[2000, 1200, 789, 2000, 1000]
uj5u.com熱心網友回復:
你應該.map()代替.filter().
ArrayList<String> mylist = new ArrayList<>(
dest.stream()
.map(s -> s.replaceAll("\\D \\s\\D \\s(\\d \\.?\\d )", "$1"))
.collect(Collectors.toList()));
System.out.println(mylist);
輸出:
[2000, 1200, 789, 2000, 1000]
uj5u.com熱心網友回復:
首先,有幾個問題值得強調:
在您的代碼以
filter()操作開始,這是正確的步驟,因為map()不能從流中丟棄元素,它會執行一對一的轉換。如果你需要確保一個元素是有效的,你需要先申請filter()。另一種選擇是使用 Java 16 操作mapMulty(),它可以將流元素轉換為**0 **(零個或多個)元素,并且可以像兩者一樣作業filter(),map()更重要的是可以提高性能,因為它允許避免使用正則運算式引擎處理有效字串兩次。double另一件需要考慮的重要事情是:指數、十六進制等的有效表示形式不止一種。所有選項都列在Double.valueOf(). 即使我們只討論一個普通的十進制浮點數1.,.9而您使用的正則運算式也不是有效double的 s。請注意,Javadoc ofvalueOf()包含一個現成的正則運算式,用于驗證雙精度數,它可以解決所有可能的問題(它真的很龐大并且充滿了評論,所以我不在這里發布它)。在正則運算式中,您不是在測驗數字是否位于字串的末尾。在您所說的描述中:“我正在嘗試獲取每個字串末尾的數字”。如果它很重要,您需要預先
$表示捕獲的字串應該位于最后。最后,用 . 包裝
List回傳的a 是多余Collectors.toList()的ArrayList。
為簡單起見,我將使用以下正則運算式,而不是提到的用于檢查所有形式的雙精度正則運算式"(\\d \\.?\\d*|\\.\\d )$"。
第一部分\\d \\.?\\d*將匹配一個整數,例如999,一個沒有小數部分的浮點數,例如1.,和一個常規浮點,例如99.999。
第二部分\\.\\d 匹配沒有整數部分的浮點數,例如.995.
在這里如何使用 Java 16 Stream API 功能和java.util.regex.MatchResult(雖然你提到 Java 8 我猜這個解決方案可能對其他讀者有用):
List<String> strings = List.of(
"abc abd 2000", "idf owe 1200", "jks ldg 789",
"ccc hhh 2000", "www uuu 1000", "ccc hhh 2000.",
"abc abd 2000.1", "idf owe 1200.0", "jks ldg 789.995", ".999", // floated-point numbers
"abc abd 2000y", "idf owe", "jks ldg 789.995%wtqop", "....ljsofo." // invalid strings
);
Pattern p = Pattern.compile("(\\d \\.?\\d*|\\.\\d )$");
List<String> numbers = strings.stream()
.<String>mapMulti((str, consumer) ->
p.matcher(str).results().map(MatchResult::group).forEach(consumer)
)
.toList();
System.out.println(numbers);
輸出:
[2000, 1200, 789, 2000, 1000, 2000., 2000.1, 1200.0, 789.995, .999]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/521553.html
標籤:爪哇正则表达式java流
上一篇:在字串中使第二個單詞大寫
