-4

"at work"、"Alan Turing"、"Manchester University" という 3 つの単語があるドキュメントのルールを作成するにはどうすればよいでしょうか。私は書いてみました:

        Pattern p = Pattern.compile("work at && Alan Turing && Manchester University");

しかし、それは機能しません.3つの単語を含む文書には何も見つかりません!

4

3 に答える 3

3

この場合、正規表現は必要ありません。ドキュメントのテキストが string として保存されていると仮定するとdocument、次のことができます。

boolean isDocumentValid = document.contains("at work") && 
                          document.contains("Alan Turing") &&
                          document.contains("Manchester University");
于 2013-06-19T15:56:49.700 に答える
3

問題は少しあいまいですが、おそらく前向きな先読みが問題を解決します:

(?=.*?\bwork at\b)(?=.*?\bAlan Turing\b)(?=.*?\bManchester University\b)^.*$

ライブデモ: http://www.rubular.com/r/MG6eih4syb

于 2013-06-19T15:51:42.120 に答える
0

JavaPatternクラスは、正規表現または正規表現の実装です。あなたが書いたものは、正規表現のようには見えません...または私が今まで見た他のテキストパターンマッチング言語.

正規表現に関するチュートリアルは、さまざまな場所で見つけることができます。例えば:

正規表現がどのように機能するかを理解したら、クラスの javadocPatternのクラス概要セクションに構文の簡潔な要約があります。

実際、正規表現はこの特定の問題には適していません。ドキュメントを検索して、2 つ以上のフレーズが順不同で含まれているかどうかを確認する場合、各フレーズを順番に検索し、3 つの一致結果を結合するのが最善の方法です。

これを単一の正規表現で解決しようとすると、出現する順序に関係なく、それらを見つけるために複雑なパターンが必要になります。先読み/後読みを使用してあいまいなものが必要か、順列を列挙するパターンを使用します。例えば

"A.*B.*C|A.*C.*B|B.*A.*C|B.*C.*A|C.*A.*B|C.*B.*A"  

ここでABCは、それぞれのフレーズに一致するサブパターンです。

3 つの個別の正規表現一致 ( を使用Matcher.find()) または単純な文字列一致 ( を使用String.contains(...)) を行うと、理解しやすく1なり、おそらくより効率的になります。


1 - これを「簡単」または「難しい」とラベル付けするかどうかは、正規表現に精通しているかどうかによって異なります。

于 2013-06-19T15:54:29.930 に答える