"at work"、"Alan Turing"、"Manchester University" という 3 つの単語があるドキュメントのルールを作成するにはどうすればよいでしょうか。私は書いてみました:
Pattern p = Pattern.compile("work at && Alan Turing && Manchester University");
しかし、それは機能しません.3つの単語を含む文書には何も見つかりません!
この場合、正規表現は必要ありません。ドキュメントのテキストが string として保存されていると仮定するとdocument
、次のことができます。
boolean isDocumentValid = document.contains("at work") &&
document.contains("Alan Turing") &&
document.contains("Manchester University");
問題は少しあいまいですが、おそらく前向きな先読みが問題を解決します:
(?=.*?\bwork at\b)(?=.*?\bAlan Turing\b)(?=.*?\bManchester University\b)^.*$
JavaPattern
クラスは、正規表現または正規表現の実装です。あなたが書いたものは、正規表現のようには見えません...または私が今まで見た他のテキストパターンマッチング言語.
正規表現に関するチュートリアルは、さまざまな場所で見つけることができます。例えば:
正規表現がどのように機能するかを理解したら、クラスの javadocPattern
のクラス概要セクションに構文の簡潔な要約があります。
実際、正規表現はこの特定の問題には適していません。ドキュメントを検索して、2 つ以上のフレーズが順不同で含まれているかどうかを確認する場合、各フレーズを順番に検索し、3 つの一致結果を結合するのが最善の方法です。
これを単一の正規表現で解決しようとすると、出現する順序に関係なく、それらを見つけるために複雑なパターンが必要になります。先読み/後読みを使用してあいまいなものが必要か、順列を列挙するパターンを使用します。例えば
"A.*B.*C|A.*C.*B|B.*A.*C|B.*C.*A|C.*A.*B|C.*B.*A"
ここでA
、B
とC
は、それぞれのフレーズに一致するサブパターンです。
3 つの個別の正規表現一致 ( を使用Matcher.find()
) または単純な文字列一致 ( を使用String.contains(...)
) を行うと、理解しやすく1なり、おそらくより効率的になります。
1 - これを「簡単」または「難しい」とラベル付けするかどうかは、正規表現に精通しているかどうかによって異なります。