Java如何检测字符串包含多个关键词呢?

书欣 Java经验 发布时间:2022-08-10 17:13:06 阅读数:7680 1
下文笔者讲述检测字符串包含多个关键字的方法分享,如下所示
实现思路:
    方式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;
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202208/16601228554207.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者