我有一個城市串列,想從這些城市中搜索:
ArrayList myCities; // list of cities
String searchString = scanner.nextLine();
List<String> matchedCities = new ArrayList(); // an empty list for storing matched cities
for(String c : myCities){
if(c.matches("(?i)" searchString ".*")){
matchedCities.add(c);
}
}
例如。apple 如果它是當前陣列中的一個元素,則 c 回傳 apple of if ap 輸入或 apple 但不回傳 ppl。
這僅適用于城市以或開頭/首字母開頭的情況,但是我希望如果用戶從中間輸入字串,它應該回傳建議的城市;
例如,如果用戶輸入 ppl,它應該回傳 apple,或任何包含 ppl 的單詞,無論它是開頭還是包含在中間或結尾。
uj5u.com熱心網友回復:
String::matches隱式檢查整個字串,就好像應用了 "^" 和 "$" 錨點一樣,因此檢查中間值的一個小修復是更新正則運算式以允許任何前綴".*"。
此外,可能需要放置searchStringbetween\Q和\Eto enable search by string literal,并自動轉義可能為正則運算式保留的字符。
if (c.matches("(?i).*\\Q" searchString "\\E.*")){
matchedCities.add(c);
}
另一種選擇是將searchString和 串列中的元素都轉換為相同的大小寫并使用contains.
使用 Stream API 的示例實作:
String search = searchString.toLowerCase();
List<String> matchedCities = cities
.stream()
.filter(c -> c.toLowerCase().contains(search))
.collect(Collectors.toList());
更新
要回傳/列印字的一部分下面search的字串,String::substring,String::indexOf和String::length可用于:city.substring(city.indexOf(search) search.length())
String search = searchString.toLowerCase();
List<String> afterMatch = cities
.stream()
.filter(c -> c.toLowerCase().contains(search))
.map(c -> c.substring(c.indexOf(search) search.length()))
.peek(System.out::println) // print the part after the search
.collect(Collectors.toList());
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/369582.html
