[英]Using Java 8 Streams replace Characters in a String if found in a list of Characters
輸入= M+a?i*n S=t
期望值= M ainst
每個字符的輸入 ,從使用的字符以下列表進行比較,如果發現有空格替換它和輸出中應expectedValue。
假設
String input;
List<Character> forbidden;
你可以使用
String result = input.replaceAll(
forbidden.stream()
.map(String::valueOf).map(Pattern::quote)
.collect(Collectors.joining("|")),
" ");
它將使用String.valueOf(…)
將每個禁止的Character
轉換為String
,然后使用Pattern.quote(…)
將其轉換為帶引號的模式字符串,以確保不將這些字符解釋為特殊的regex構造,然后將所有字符都加入使用|
在正則表達式模式中表示“或”。 然后, String.replaceAll(regex, replacement)
完成實際的工作。
沒有正則表達式的替代方法(“純流操作”)是
String result = input.chars()
.map(c -> forbidden.contains((char)c)? ' ': c)
.collect(StringBuilder::new, (sb, c) -> sb.append((char)c), StringBuilder::append)
.toString();
這將直接遍歷所有字符,檢查它們是否包含在forbidden
集合中,如果存在則將其替換為空格,最后將映射的字符收集到一個新的String
。 由於被每個字符調用的contains
的時間復雜性,當forbidden
將其更改為Set<Character>
而不是List<Character>
時,效率會更高。
似乎微不足道:
System.out.println(input.replaceAll("[^a-zA-Z]", " "));
要么
System.out.println(input.replaceAll("[^\\p{L}]", " "));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.