Java如何检测字符串包含多个关键词呢?
下文笔者讲述检测字符串包含多个关键字的方法分享,如下所示
实现思路:
方式1:使用 String.contains()方法即可对关键字进行判断
方式2:使用 String.indexOf()检测关键字的位置,判断关键字的存在性
方式3:使用正则表达式判断字符的存在性
方式4:使用list进行判断
方式5:使用使用AC算法(*Aho-Corasick*)算法进行判断
使用String.contains()方法进行判断
public static boolean containsWords(String inputString, String[] items) {
boolean flag = true;
for (String item : items) {
if (!inputString.contains(item)) {
flag = false;
break;
}
}
return flag;
}
使用String.indexOf()进行判断
public static boolean containsWordsIndexOf(String inputString, String[] words) {
boolean flag = true;
for (String word : words) {
if (inputString.indexOf(word) == -1) {
flag = false;
break;
}
}
return flag;
}
使用正在表达式
public static boolean containsWordsPatternMatch(String inputString, String[] words) {
StringBuilder regexp = new StringBuilder();
for (String word : words) {
regexp.append("(?=.*").append(word).append(")");
}
Pattern pattern = Pattern.compile(regexp.toString());
return pattern.matcher(inputString).find();
}
Java8 和 List
List<String> inputString = Arrays.asList(inputString.split(" ")); List<String> words = Arrays.asList(words); 流API public static boolean containsWordsJava8(String inputString, String[] words) { List<String> inputStringList = Arrays.asList(inputString.split(" ")); List<String> wordsList = Arrays.asList(words); return wordsList.stream().allMatch(inputStringList::contains); }
使用AC算法(*Aho-Corasick*)
实现思路:
<dependency>
<groupId>org.ahocorasick</groupId>
<artifactId>ahocorasick</artifactId>
<version>0.4.0</version>
</dependency>
首先使用关键词数组构建Trie管道,使用 Trie数据结构:
Trie trie = Trie.builder().onlyWholeWords().addKeywords(words).build();
然后传入 inputString参数 调用解析方法并保存结果至 emits集合中:
Collection<Emit> emits = trie.parseText(inputString);
最后打印结果
emits.forEach(System.out::println);
例:
public static boolean containsWordsWithAC(String inputString, String[] words) {
Trie trie = Trie.builder().onlyWholeWords().addKeywords(words).build();
Collection<Emit> emits = trie.parseText(inputString);
emits.forEach(System.out::println);
boolean flag = true;
for(String word : words) {
boolean contains = Arrays.toString(emits.toArray()).contains(word);
if (!contains) {
flag = false;
break;
}
}
return flag;
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


