当前位置: 首页 > 面试题库 >

使用Java Regex,如何检查字符串是否包含集合中的任何单词?

荆利
2023-03-14
问题内容

我有一组话要说-苹果,橙子,梨,香蕉,猕猴桃

我想检查一个句子是否包含上面列出的任何单词,如果包含,我想找到匹配的单词。我如何在Regex中完成此操作?

我目前正在为每个单词集调用String.indexOf()。我假设这不如正则表达式匹配有效?


问题答案:

TL; DR 对于简单的子字符串contains()最好,但对于仅匹配整个单词的正则表达式可能更好。

查看哪种方法更有效的最佳方法是对其进行测试。

您可以使用String.contains()代替String.indexOf()来简化您的非正则表达式代码

要搜索其他单词,正则表达式如下所示:

apple|orange|pear|banana|kiwi

|作品作为OR正则表达式中的作品。

我非常简单的测试代码如下所示:

public class TestContains {

   private static String containsWord(Set<String> words,String sentence) {
     for (String word : words) {
       if (sentence.contains(word)) {
         return word;
       }
     }

     return null;
   }

   private static String matchesPattern(Pattern p,String sentence) {
     Matcher m = p.matcher(sentence);

     if (m.find()) {
       return m.group();
     }

     return null;
   }

   public static void main(String[] args) {
     Set<String> words = new HashSet<String>();
     words.add("apple");
     words.add("orange");
     words.add("pear");
     words.add("banana");
     words.add("kiwi");

     Pattern p = Pattern.compile("apple|orange|pear|banana|kiwi");

     String noMatch = "The quick brown fox jumps over the lazy dog.";
     String startMatch = "An apple is nice";
     String endMatch = "This is a longer sentence with the match for our fruit at the end: kiwi";

     long start = System.currentTimeMillis();
     int iterations = 10000000;

     for (int i = 0; i < iterations; i++) {
       containsWord(words, noMatch);
       containsWord(words, startMatch);
       containsWord(words, endMatch);
     }

     System.out.println("Contains took " + (System.currentTimeMillis() - start) + "ms");
     start = System.currentTimeMillis();

     for (int i = 0; i < iterations; i++) {
       matchesPattern(p,noMatch);
       matchesPattern(p,startMatch);
       matchesPattern(p,endMatch);
     }

     System.out.println("Regular Expression took " + (System.currentTimeMillis() - start) + "ms");
   }
}

我得到的结果如下:

Contains took 5962ms
Regular Expression took 63475ms

显然,时间的长短取决于要搜索的单词数和要搜索的字符串,但是contains()对于像这样的简单搜索,它似乎比正则表达式快约10倍。

通过使用正则表达式在另一个字符串中搜索字符串,您正在使用大锤破解螺母,因此我想我们应该不会感到惊讶,因为它速度较慢。保存正则表达式,以在您要查找的模式更复杂时使用。

您可能要使用正则表达式的一种情况是if indexOf()并且contains()不会执行该工作,因为 您只想匹配整个单词
,而不仅仅是子字符串,例如,您想要匹配pear但不匹配spears。正则表达式具有单词边界的概念,因此可以很好地处理这种情况。

在这种情况下,我们将模式更改为:

\b(apple|orange|pear|banana|kiwi)\b

\b只匹配单词开头或结尾的“ 说”,方括号将OR表达式归为一组。

请注意,在代码中定义此模式时,您需要使用另一个反斜杠来转义反斜杠:

 Pattern p = Pattern.compile("\\b(apple|orange|pear|banana|kiwi)\\b");


 类似资料:
  • 问题内容: 我想检查我的字符串是否包含+字符。我尝试了以下代码 但是它没有给出预期的结果。 问题答案: 您需要此: 类的方法不使用正则表达式作为参数,而是使用普通文本。 编辑: 输出:

  • 问题内容: 什么是最好的纯Python实现,以检查字符串是否包含字母表中的任何字母? 哪里会因为没有字母而返回,而会因为有了字母而返回。 问题答案: 正则表达式应该是一种快速的方法:

  • 问题内容: 这个问题的答案是 社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 考虑: 假设我有上面的代码,编写该语句的正确方法是什么? 问题答案: 您可以使用该函数来查找另一个字符串中另一个字符串的出现: 注意,of的使用是故意的(既不会也不返回期望的结果);返回大海捞针字符串中针线串起始处的偏移量,或者返回boolean值(如果找不到针)。由于0是有效的偏移量,而0是“假”,

  • 问题内容: 我需要检查字符串是否包含数字。任何数字。字符串是否为数字,而不是数字,但包含一个数字。 例子: ‘test’=没有数字。 ‘test2’=包含数字。 问题答案: 使用正则表达式: 不使用正则表达式:

  • 问题内容: 伪代码 我正在寻找一个PHP函数,如果单词在文本中存在,该函数将返回true。 问题答案: 您可以根据需要选择几种方法。对于这个简单的示例,可能是最简单,最直接的函数。如果您需要对结果进行处理,则可以选择或。如果您需要使用复杂的图案而不是字符串作为针,您将需要。 strpos()和stripos()方法(stripos()不区分大小写): strstr()和stristr()方法(st

  • 本文向大家介绍如何检查一列中的任何字符串是否包含MySQL中的特定字符串?,包括了如何检查一列中的任何字符串是否包含MySQL中的特定字符串?的使用技巧和注意事项,需要的朋友参考一下 为此,请与LIKE运算符一起使用。让我们首先创建一个表- 使用插入命令在表中插入一些记录- 使用select语句显示表中的所有记录- 这将产生以下输出- 以下是查询以检查列中的任何字符串是否包含特定字符串- 这将产生