在 Java 8 字符串中搜索列表中是否存在单词

Searching a Java 8 string for the existence of words from a list

Java 8 在这里。我得到了一个列入黑名单的列表 words/expressions 以及一个输入字符串。我需要确定是否有任何列入黑名单的项目出现在输入字符串中:

List<String> blacklist = new ArrayList<>();

// populate the blacklist and "normalize" it by removing whitespace and converting to lower case
blacklist.add("Call for info".toLowerCase().replaceAll("\s", ""));
blacklist.add("Travel".toLowerCase().replaceAll("\s", ""));
blacklist.add("To be determined".toLowerCase().replaceAll("\s", ""));
blacklist.add("Meals".toLowerCase().replaceAll("\s", ""));
blacklist.add("Custom Call".toLowerCase().replaceAll("\s", ""));
blacklist.add("Custom".toLowerCase().replaceAll("\s", ""));

// obtain the input string and also "normalize" it
String input = getSomehow().toLowerCase().replaceAll("\s", ""));

// now determine if any blacklisted words/expressions appear inside the input
for(String blItem : blacklist) {
    if (input.contains(blItem)) {
        throw new RuntimeException("IMPOSSSSSSSIBLE!")
    }
}

认为 这很好用,直到我的 input 字符串中包含单词“Customer”。

由于 custom 存在于 customer 中,程序抛出异常。 相反,我希望它被允许,因为"customer"不是黑名单词。

所以我认为这里的实际逻辑是:

认为可以涵盖我的所有基础。

Java 8 或任何(Apache 或其他)"commons" 库是否有任何可以帮助我的东西?出于某种原因,我很难解决这个问题并使代码看起来优雅(我不确定如何从正则表达式等内部检查字符串的 beginning/ending)。

有什么想法吗?

您可以为给定的单词预编译一个模式列表。

\b表示字界。在字符串的两边添加单词边界将匹配正则表达式的确切单词。

List<Pattern> blackListPatterns =
    blackList
        .stream()
        .map(
                word -> Pattern.compile("\b" + Pattern.quote(word) + "\b")
        ).collect(Collectors.toList());

然后您可以将单词与模式列表进行匹配。

如果您确定您的单词不会包含任何元字符,例如 (* 等,您可以直接从字符串创建您的模式,而不是使用 Pattern.quote(),这用于转义元字符。

for (Pattern pattern : blackListPatterns) {
    if (pattern.matcher(input).find()) {
        throw new RuntimeException("IMPOSSSSSSSIBLE!")
    }
}