2

テキスト内の国名を見つけるコードを書いています。と言う国名の辞書を使っていますIndia, America, Sri Lanka, ...。私は現在、辞書から使用text.contains(key)しています。keyただし、これは のような文字列に対しても true を返しますIndiana。私は文の単語を配列に入れてからcontainsを実行しようとしました.equalsでも同様のアプローチを考えることができますが、それらは本当に遅いです. あなたが考えることができる他のより速い方法はありますか?

4

3 に答える 3

9

単語境界クラスを使用してみる\b

s.matches(".*\\b" + key + "\\b.*")
于 2013-04-03T05:47:47.863 に答える
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
于 2013-04-03T05:54:36.847 に答える
0

contains()働くべきだった。を試すこともできますString.indexOf(String)。-1 以外が返された場合、そのクエリ文字列は前述の文字列に存在し、そうでない場合は存在しません。

于 2013-04-03T05:46:29.857 に答える