5

次のような論理一致基準を取得しようとしています:

(("Foo" OR "Foo Bar" OR FooBar) AND ("test" OR "testA" OR "TestB")) OR TestZ

を使用して、豚のファイルに対する一致としてこれを適用します

result = filter inputfields by text matches (some regex expression here));

問題は、上記の論理式を Match メソッドの正規表現に切り詰める方法がわからないことです。

私はさまざまなことをいじりましたが、最も近いものは次のようなものです:

((?=.*?\bFoo\b | \bFoo Bar\b))(?=.*?\bTestZ\b)

何か案は?可能であれば、この変換をプログラムで行う必要もあります。

いくつかの例:

a - 速い茶色の Foo が遅延テストを飛び越えました (foo と test が含まれているため、これはパスするはずです)

b - TestZ で何かが起こっていました (testZ が含まれているため、これもパスします)

c - 素早い茶色の Foo が怠惰な犬を飛び越えました (Foo が含まれているが、test、testA、または TestB が含まれていないため、これは失敗するはずです)

ありがとう

4

2 に答える 2

1

この正規表現をmatchesメソッドに使用できます

^((?=.*\\bTestZ\\b)|(?=.*\\b(FooBar|Foo Bar|Foo)\\b)(?=.*\\b(testA|testB|test)\\b)).*
  • またはを含む文字列でのみ一致を妨げない"Foo" OR "Foo Bar" OR "FooBar"ように記述する必要があることに注意してくださいFooBar|Foo Bar|FooFoo|Foo Bar|FooBarFooFooBarFoo Bar
  • また、先読みは幅がゼロ.*であるため、一致が文字列全体と一致するように正規表現の最後に渡す必要があります。

デモ

String[] data = { "The quick brown Foo jumped over the lazy test",
        "the was something going on in TestZ",
        "the quick brown Foo jumped over the lazy dog" };
String regex = "^((?=.*\\bTestZ\\b)|(?=.*\\b(FooBar|Foo Bar|Foo)\\b)(?=.*\\b(testA|testB|test)\\b)).*";
for (String s : data) {
    System.out.println(s.matches(regex) + " : " + s);
}

出力:

true : The quick brown Foo jumped over the lazy test
true : the was something going on in TestZ
false : the quick brown Foo jumped over the lazy dog
于 2013-09-01T11:53:39.677 に答える