在字符串中搜索单词

时间:2010-10-07 06:20:12

标签: java regex string

如果我在字符串中查找特定单词,例如,在字符串“你好吗”我正在寻找“是”。  常规indexOf()工作得更快更好还是Regex匹配()

String testStr = "how are you";
String lookUp = "are";

//METHOD1
if (testStr.indexOf(lookUp) != -1)
{
 System.out.println("Found!");
}

//OR
//METHOD 2
if (testStr.match(".*"+lookUp+".*"))
{
 System.out.println("Found!");
}

上述两种方法中的哪一种是在另一个字符串中查找字符串的更好方法?还是有更好的选择?

  • Ivard

9 个答案:

答案 0 :(得分:17)

如果你不关心它是否真的与你所匹配的整个单词相匹配,那么indexOf()将会快得多。

另一方面,如果您需要能够区分areharebrainedaren't等,那么您需要一个正则表达式:\bare\b将只匹配are作为整个单词(Java中为\\bare\\b)。

\b是一个单词边界锚点,它匹配字母数字字符(字母,数字或下划线)和非字母数字字符之间的空格。

警告:这也意味着如果你的搜索词实际上不是一个单词(假设你正在寻找###),那么这些单词边界锚点只会匹配{{1}这样的字符串。 },但不在aaa###zzz

进一步警告:默认情况下,Java对于构成字母数字字符的内容有一个有限的世界观。此处只有ASCII字母/数字(加上下划线)计数,因此单词边界锚点会对+++###+++élèverelevé等单词失败。 Read more about this (and how to solve this problem) here

答案 1 :(得分:1)

方法一应该更快,因为它具有更少的开销。如果它是关于在大型文件中搜索的性能,那么像boyer moore pattern matching这样的专门方法可以带来进一步的改进。

答案 2 :(得分:1)

如果您正在寻找固定字符串而不是模式,就像问题中的示例一样,indexOf会更好(更简单)和更快,因为它不需要使用正则表达式。

此外,如果您要搜索的字符串确实包含正则表达式中具有特殊含义的字符,则indexOf您无需担心转义这些字符。

一般情况下,尽可能使用indexOfmatch进行模式匹配,indexOf无法满足您的需求。

答案 3 :(得分:0)

如果您在另一个内部查找一个字符串,则应使用indexOfcontains方法。示例:查看字符串中是否存在"foo"

但如果您正在寻找模式,请使用match方法 示例:查看字符串的开头/结尾中是否存在"foo"。或者看看它是否作为整个字出现。

由于正则表达式引擎开销,使用match方法进行简单的字符串搜索效率不高。

答案 4 :(得分:0)

第一种方法更快,因为它不是复杂的表达式,所以没有理由在这里使用正则表达式。

答案 5 :(得分:0)

当然indexOf()优于match()。 一个'匹配()'由许多比较组成:a == a,r == r,e == e; 同时,你追加通配符,这些通配符可分为许多情况:

  1. ?是
    ??是
    ???是
    ????是
    ........ 是吗?是??是???
  2. 直到它与原始字符串一样长。

答案 6 :(得分:0)

你的问题几乎可以回答自己;如果你必须询问正则表达式是否是更好的选择,那几乎肯定不是。此外,当您在正则表达式和非正则表达式解决方案之间进行选择时,性能永远不应成为您的主要标准。等到你有一些工作代码并对其进行分析。

答案 7 :(得分:0)

比较两个版本的更好方法是分析indexOf方法的源代码和regex.matches方法本身,计算Big_O_notation中算法实现的运行时间并比较它们的最佳,平均和最差情况(在分别是字符串的开头,中间或结尾)。源代码在此处indexOf_source和此处regex.matches。我们需要对两者进行运行时分析,以了解它究竟在做什么。忙碌的任务,但它是进行真正比较的唯一方法,其余的只是假设。不错的问题。

答案 8 :(得分:0)

我用它:

public boolean searchStr(String search, String what) {
    if(!search.replaceAll(what,"_").equals(search)) {
        return true;
    }
    return false;
}

使用示例:

String s = "abc";
String w = "bc";
if(searchStr(s,w)) { 
    //this returns true
}
s="qwe";
w="asd";
if(searchStr(s,w)) { 
    //this returns false
}
相关问题