1

リストされているすべての国のすべてのインスタンスを抽出したいテキストのコレクションがあります。これまでのところ、次のコードに基づいて、すべての国をセットに取り込むことができました。

  Set<String> countries = new TreeSet<String>();
  Locale[] locales = Locale.getAvailableLocales();
  for (Locale locale : locales) {
        countries.add(locale.getDisplayCountry());
  }

もちろん、各国の正規表現を作成して各行で検索することもできますが、この正規表現でこれを実行できるかどうか、つまり、この特定の行でどの国が言及されているかを考えていました。

4

3 に答える 3

2

すべての国の名前を1つの正規表現に連結します。

String regex = "(";
boolean first = true;

for (String name: countries) {
    regex += (first ? "" : "|") + Pattern.quote(name);
    first = false;
}

regex += ")";

(でより効率的なコードを書くことができますStringBuffer

次の形式の正規表現を取得します(Country1|Country2|Country3)。これは、テキストが国名のいずれかに一致する場合に一致します。

このソリューションは、国名をから取得する名前と正確に(スペースとドットまで)一致させることを前提としていますgetDisplayCountry(?i)正規表現の前に付けることで、大文字と小文字を区別せずに一致させることができます。

于 2012-07-25T09:59:42.873 に答える
1

'|'で区切られたすべての名前を連結して、「これらのいずれでも問題ない」ことを示すことにより、単一の正規表現を作成できます。あなたの場合、あなたは構築することができます

StringBuilder exp = new StringBuilder();
for (String s : countries) {
  exp.append(exp.length() == 0 ? "(" : "|");
  exp.append(s);
}
Pattern countryPattern = Pattern.compile(exp.append(")").toString());

そして、countryPatternが与えられると、次のように記述して、すべての一致を反復処理できるようになります。

Matcher m = countryPattern.matcher(aStringWithCountries);
while (m.find()) {
   System.err.println("Found country " + m.group(1));
}
于 2012-07-25T10:03:59.413 に答える
0

単純な一致(完全な文字列一致)の場合、正規表現よりも実際には優れた方法があります。Aho-Corasickアルゴリズムと呼ばれる強力な文字列照合アルゴリズムがあります。したがって、必要なのは、Aho-Corasickツリーを作成し、国名を入力することです。次に、テキスト内でこれらの国を最適な時間計算量で検索できます。これがPythonの実装であり、Javaにもいくつかあることを願っています。

于 2015-04-22T10:40:14.533 に答える