gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 18:46:05 28 4
gpt4 key购买 nike

我有一组单词——苹果、橙子、梨、香蕉、猕猴桃

我想检查一个句子是否包含上面列出的任何单词,如果包含,我想找到哪个单词匹配。我怎样才能在正则表达式中实现这一点?

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

最佳答案

TL;DR For simple substrings contains() is best but for only matching whole words Regular Expression are probably better.

要了解哪种方法更有效,最好的方法就是对其进行测试。

您可以使用 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 倍.

通过使用正则表达式在另一个字符串中搜索字符串,您就像在使用大锤来破解坚果,所以我想我们不应该对它的速度变慢感到惊讶。当您要查找的模式更复杂时,请保存正则表达式。

您可能想要使用正则表达式的一种情况是,如果 indexOf()contains() 无法完成这项工作,因为您只想匹配整个单词,而不仅仅是子字符串,例如您想要匹配 pear 而不是 spears。正则表达式可以很好地处理这种情况,因为它们具有 word boundaries 的概念。 .

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

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

\b 表示仅匹配单词的开头或结尾,括号将 OR 表达式组合在一起。

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

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

关于java - 使用 Java Regex,如何检查字符串是否包含集合中的任何单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59838641/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com