2013-04-03 4 views
2

나는 텍스트에 국가 이름을 표시하는 코드를 작성 중입니다. 나라 이름으로 사전을 사용하고 있습니다. India, America, Sri Lanka, ...입니다. 현재 text.contains(key)key과 함께 사용하고 있습니다. 그러나 이것은 Indiana과 같은 문자열에도 true를 반환합니다. 나는 문장의 단어를 배열에 넣고 그 다음에 포함하는 것을 시도했다. 비슷한 접근법은 같음으로 간주 될 수 있지만 실제로는 느리다. 당신이 생각할 수있는 다른 빠른 방법이 있습니까?자바를 사용하여 문장의 정확한 단어 찾기

+4

가 왜 느린 고려 코드의 관련 부분을 게시하지? 자신이하는 일을 이해하고 개선하는 데 도움이 될 것입니다. –

+1

'contains()'는 발견 한 부분 일치에 대해 true를 반환합니다. 그러나 당신이'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 
관련 문제