簡體   English   中英

如果在字符列表中找到字符串,則使用Java 8 Streams替換字符串中的字符

[英]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。

。,(,:,;,),{,*,+,_,-,!,?,〜,%,=,¦,¬,¢,\\,<,>,&,,,},$, '',`,@,[,],±,Ñ,P¦,_,$

假設

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM