2013-04-03 36 views
2

我正在编写一段代码来查找文本中的国家/地区名称。我使用的国家名称的字典表示India, America, Sri Lanka, ...。我目前使用text.contains(key)key从字典中。但是,即使对于像Indiana这样的字符串,这也会返回true。我尝试将句子中的单词放在数组中,然后执行包含,类似的方法可以用equals来考虑,但它们确实很慢。还有其他更快的方式可以想到吗?使用Java在句子中查找确切单词

+4

你为什么不张贴你考虑慢的代码的相关部分?理解你在做什么并帮助你改进它会更容易。 –

+1

'contains()'返回真正的部分匹配,你可能已经发现了。但是你怎么确定'equals()'比'contains()'慢呢?可能是我不明白你的问题。 – asgs

+0

为什么不使用正则表达式? –

回答

9

尝试使用word boundary\b

s.matches(".*\\b" + key + "\\b.*") 
0

应该已经工作。您也可以尝试String.indexOf(String)。如果它返回的值不是-1,则该查询字符串存在于该字符串中,否则不存在。

1

也许你应该使用一些文本处理库。

这里是一个正则表达式的解决方案:

import java.util.regex.*; 
import static java.lang.System.*; 
public class SO { 
    public static void main(String[] args) { 
     String[] dict={"india","america"}; 
     String patStr=".*\\b(" + combine(dict,"|") + ")\\b.*"; 
     out.println("pattern: "+patStr+"\n"); 
     Pattern pat=Pattern.compile(patStr); 

     String input1="hello world india indiana"; 
     out.println(input1+"\t"+pat.matcher(input1).matches()); 

     String input2="hello world america americana"; 
     out.println(input2+"\t"+pat.matcher(input2).matches()); 

     String input3="hello world indiana amercana"; 
     out.println(input3+"\t"+pat.matcher(input3).matches()); 
    } 
    static String combine(String[] s, String glue){ 
     int k=s.length; 
     if (k==0) return null; 
     StringBuilder out=new StringBuilder(); 
     out.append(s[0]); 
     for (int x=1;x<k;++x) 
     out.append(glue).append(s[x]); 
     return out.toString(); 
    } 
} 

输出:

pattern: .*\b(india|america)\b.* 

hello world india indiana  true 
hello world america americana true 
hello world indiana amercana false