解決策は長い間受け入れられているようですが、解決策は改善される可能性があるため、誰かが同様の問題を抱えている場合:
これは、マルチパターン検索アルゴリズムの古典的なアプリケーションです。
Java パターン検索 (with Matcher.find) は、それを行う資格がありません。正確に 1 つのキーワードの検索は Java で最適化されています。or 式の検索は、不一致でバックトラックする正規表現の非決定論的オートマトンを使用します。最悪の場合、テキストの各文字が l 回処理されます (l はパターンの長さの合計です)。
単一パターン検索の方が優れていますが、修飾もされていません。すべてのキーワード パターンの検索全体を開始する必要があります。最悪の場合、テキストの各文字が p 回処理されます。ここで、p はパターンの数です。
マルチパターン検索は、テキストの各文字を 1 回だけ処理します。このような検索に適したアルゴリズムは、Aho-Corasick、Wu-Manber、または Set Backwards Oracle Matching です。これらは、 Stringsearchalgorithmsやbyteseekなどのライブラリで見つけることができます。
// example with StringSearchAlgorithms
AhoCorasick stringSearch = new AhoCorasick(asList("123woods", "woods"));
CharProvider text = new StringCharProvider("I will come and meet you at the woods 123woods and all the woods", 0);
StringFinder finder = stringSearch.createFinder(text);
List<StringMatch> all = finder.findAll();