Java检查字符串包含多个关键词

本文介绍如何在字符串中监测多个关键词。

1. 需求说明

String inputString = "hello there, java";

我们的任务是在 inputString中查找是否有 hellojava 两个单词。把要查找的关键词放入数组中:

String[] words = {"hello", "java"};

查找的顺序不重要,但应该需要大小写敏感。

2. 传统方法

2.1 String.contains()

我们首先使用 String.contains()方法实现,循环关键词数组依次监测:

public static boolean containsWords(String inputString, String[] items) {boolean found = true;for (String item : items) {if (!inputString.contains(item)) {found = false;break;}}return found;
}

如果包括特定关键词contains()方法返回 true。只要有一个关键词不被包括,则结束循环并返回 false。虽然这个方法需要代码较多,但它是最简单也是最快的方法。

2.2 String.indexOf()

与上面方法类似,我们可以使用 indexOf方法监测关键词的位置。实现如下:

public static boolean containsWordsIndexOf(String inputString, String[] words) {boolean found = true;for (String word : words) {if (inputString.indexOf(word) == -1) {found = false;break;}}return found;
}

如果监测到 indexOf()具体位置,否则返回 -1

2.3 使用正在表达式

下面我们使用正则表达式实现,因此需要使用 Pattern类。首先我们定义字符串表达式,因为需要匹配两个关键词,我们使用向前匹配模式:

Pattern pattern = Pattern.compile(**"(?=.\*hello)(?=.\*java)"**);

通用写法:

StringBuilder regexp = new StringBuilder();
for (String word : words) {regexp.append("(?=.*").append(word).append(")");
}

然后使用 matcher()方法进行监测:

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());// Pattern pattern = Pattern.compile(regexp.toString(), Pattern.CASE_INSENSITIVE);return pattern.matcher(inputString).find();
}

但是正则有性能花销,如果要查找多个关键词,该方法不是最优方案。

3. Java8 和 List

我们使用Java 8 的 流 API实现,首先对前面的数据进行转换:

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);
}

如果源字符串包括所有关键词,则上面管道操作返回true。部分匹配可以使用 anyMatch方法。

另外完全匹配也可以使用 Collection中的 containsAll方法实现:

public static boolean containsWordsArray(String inputString, String[] words) {List<String> inputStringList = Arrays.asList(inputString.split(" "));List<String> wordsList = Arrays.asList(words);return inputStringList.containsAll(wordsList);
}

4. 使用AC算法(*Aho-Corasick* )

简言之,AC算法在字符串中查找多个关键词,算法复杂度为 O(n) ,与多少个关键词或长度没有关系。

增加依赖:

<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 found = true;for(String word : words) {boolean contains = Arrays.toString(emits.toArray()).contains(word);if (!contains) {found = false;break;}}return found;
}

上面示例仅查找完整关键词。如果你还需要如 hellojava,那仅需要删除 onlyWholeWords方法。

5. 总结

本文介绍了多种方法实现在字符串中查找多个关键词方法。

Java检查字符串包含多个关键词相关推荐

  1. Android和Java检查字符串中是否含有表情符并和谐(替换)

    最近项目里读取文本的内容里含有了表情符,传递给后端后无法存入数据库,虽然现在后端修复了,但是我还是想自己过滤,百度了一下发现网上csdn有大量此类代码但是几乎都有错误在里面不知道是不是故意有人为之,特 ...

  2. Java检查字符串是否包含中文字符

    强烈推荐一个大神的人工智能的教程:http://www.captainbed.net/zhanghan [前言] 最近项目的短信服务对接外国的第三方发短信通道,第三方对短信内容有限制,不能含中文字符( ...

  3. Android java判断字符串包含某个字符段(或替换)

    String str = "1234567"; if(str.indexOf("23") != -1) { System.out.println("包 ...

  4. Java判断字符串包含英文

    /** 判断字符串中是否含有英文,包含返回true*/ private boolean isENChar(String string) {boolean flag = false;Pattern p ...

  5. java 判断字符串包含几个字符_java中如何判断一个字符串包含几个指定字符

    可以用String类里的indexOf(String s,int i)方法,这个方法s是字符串div,i是从i下标开始查找该字符串在调用字符串中的位置,返回值是int类型. 相关学习视频推荐:java ...

  6. java检查两个字符串是否包含,java判断一个字符串是否包含另外一个字符串,java另外一个,要检查一个字符串是否包含...

    java判断一个字符串是否包含另外一个字符串,java另外一个,要检查一个字符串是否包含 要检查一个字符串是否包含另外一个字符串需要使用indexOf()方法,如果indexOf方法返回大于等于0的值 ...

  7. 如何在Java中检查字符串是否为数字

    在解析字符串之前,如何检查字符串是否为数字? #1楼 解析它(即使用Integer#parseInt )并简单地捕获异常. =) 需要澄清的是:parseInt函数检查它是否可以在任何情况下(显然)都 ...

  8. Python检查字符串是否包含另一个字符串

    String manipulation is a common task in any programming language. Python provides two common ways to ...

  9. 判断字符串不包含某个字符php,java判断字符串是否包含某个字符的方法

    java判断字符串是否包含某个字符的方法: 一.contains方法 1:描述 java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序列 2: ...

最新文章

  1. c/c++ c++ file c++/stl/boost 判断文件目录是否存在
  2. 【2020/6/24整理版】利用csi tool获取csi数据并进行数据解析----适合初学的小白
  3. Android 用户界面---定制组件(Custom Components)
  4. 2017 企业服务创新大会启动,助力中国企业敏捷发展
  5. 来自未来团队伙伴的一封信
  6. log4j2 mybatis 显示 sql 和 结果集
  7. Java 文件操作一(写文件、按行读文件、删除文件、复制文件、追加数据、创建临时文件、修改最后修改日期、获取文件大小)
  8. Maven 打包war文件
  9. 洛谷——P2006 赵神牛的游戏
  10. 开课吧课堂:finally如何使用?作用是什么?
  11. server 2008 R2+IIS7.5安装cacti实验
  12. Python基于wordnet实现词语相似度计算分析
  13. 计算机学报论文审稿流程,计算机学报投稿.docx
  14. cass简码大全_CASS简码与实体编码对照表
  15. 170713 逆向-填数游戏
  16. 织梦DedeCMS搜索页面搜索结果总数调用方法
  17. 使用Qt开发中国象棋(六):将军和死棋检测
  18. 汽车电子之NXP车规级芯片
  19. Centos7 本地IOS配置本地yum源
  20. 2020-CIKM-DisenHAN: Disentangled Heterogeneous Graph Attention Network for Recommendation

热门文章

  1. linux复制整个内容快捷键,linux复制快捷键_Linux系统快捷键最全合集
  2. css3 box-shadow 盒子效果
  3. 商品sku算法php,笛卡尔乘积-电商网站商品sku组合算法应用
  4. Android_控制闪光灯
  5. Java面向对象特征有那些
  6. HTML表格 学习打卡
  7. 这34道接口测试 Jmeter面试题,你会吗?
  8. 树莓派+PCA9685+舵机控制:wiringPi实现
  9. 自动气象站 气象环境管理者 清易
  10. 程序员、架构师、技术经理、技术总监和CTO都是干什么的?