在 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"不是黑名单词。
所以我认为这里的实际逻辑是:
- 如果输入字符串包含黑名单词...
- ...并且黑名单单词前面是字符串的开头或非字母 (
[a-z]
) 字符...
- ...并且黑名单单词后接字符串末尾或非字母字符...
- ...然后抛出异常
我认为可以涵盖我的所有基础。
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!")
}
}
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"不是黑名单词。
所以我认为这里的实际逻辑是:
- 如果输入字符串包含黑名单词...
- ...并且黑名单单词前面是字符串的开头或非字母 (
[a-z]
) 字符... - ...并且黑名单单词后接字符串末尾或非字母字符...
- ...然后抛出异常
我认为可以涵盖我的所有基础。
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!")
}
}