从字符串中删除列表或数组的元素

AL̲*_*̲̳I 3 java arrays string list

我有一个列表或字符串数​​组

String [] elements = {"cat", "dog", "fish"};
Run Code Online (Sandbox Code Playgroud)

和一个字符串

String str = "This is a caterpillar and that is a dogger.";
Run Code Online (Sandbox Code Playgroud)

我想从字符串中删除数组/列表的所有项目(如果字符串中存在)。这样函数应该返回一个字符串

str = "This is a erpillar and that is a ger." (cat and dog removed from the string)
Run Code Online (Sandbox Code Playgroud)

我可以做这样的事情

private String removeElementsFromString (String str, String [] elements) {
        if(Arrays.stream(elements).anyMatch(str::contains)){
            for(String item : elements){
                str = str.replace(item, "");
            }
        }
        return str;
    }
Run Code Online (Sandbox Code Playgroud)

但是将 for 循环更改为其他循环的优雅方法是什么?

Arv*_*ash 6

单线解决方案

下面的一行代码完成了这项工作:

str = str.replaceAll(Arrays.stream(elements).map(s -> "(?:" + s + ")").collect(Collectors.joining("|")), "");
Run Code Online (Sandbox Code Playgroud)

演示:

import java.util.Arrays;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        String[] elements = { "cat", "dog", "fish" };
        String str = "This is a caterpillar and that is a dogger.";
        
        str = str.replaceAll(Arrays.stream(elements).map(s -> "(?:" + s + ")").collect(Collectors.joining("|")), "");

        System.out.println(str);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

This is a erpillar and that is a ger.
Run Code Online (Sandbox Code Playgroud)

ONLINE DEMO

解释:

Arrays.stream(elements).map(s -> "(?:" + s + ")").collect(Collectors.joining("|"))结果进入正则表达式,(?:cat)|(?:dog)|(?:fish)意味着 cator dogor fish

下一步是将生成的正则表达式替换为"".