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; }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。