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

Kot*_*tha -1 java java-8 java-stream

输入= M+a?i*n S=t

期望值= M a i n s t

每个角色从比较输入与字符的下面的列表,如果发现有空格替换它和输出中应expectedValue

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

Hol*_*ger 5

假设

String input;
List<Character> forbidden;
Run Code Online (Sandbox Code Playgroud)

你可以使用

String result = input.replaceAll(
     forbidden.stream()
              .map(String::valueOf).map??(Pattern::quote)
              .collect(Collectors.joining("|")),
     " ");
Run Code Online (Sandbox Code Playgroud)

它将每个禁止的字符转换CharacterStringusing String.valueOf(…),然后将使用Pattern.quote(…)将它们转换为带引号的模式字符串,以确保不将字符解释为特殊的regex构造,然后将所有字符都用|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();
Run Code Online (Sandbox Code Playgroud)

这将直接遍历所有字符,检查它们是否包含在forbidden集合中,如果存在则将其替换为空格,最后将映射的字符收集到new Stringforbidden更改为a Set<Character>而不是List<Character>由于contains对每个字符调用的时间复杂性会更有效。