1

現在、RFT(Rational Functional Tester)の私のJavaコード


クラス RegularExpressionを参照し、このページで「RegularExpression」というテキストを検索して、RegularExpression を使用します。


のように見える

RegularExpression RegExp = new RegularExpression("eduId="+edu_id, false);
to = find(atDescendant(".documentName",RegExp));

ここで、別の正規表現を追加する必要があります

RegularExpression RegExp2 = new RegularExpression("some_text", false);

次に、 ANDを使用してこれら 2 つの正規表現を組み合わせる必要があります

何かのようなものRegularExpression RegExp_final = RegExp && RegExp2;

そのため、find コマンドで最後のものを使用できます。to = find(atDescendant(".documentName",RegExp_final));

誰かが構文、これを書き留める方法を手伝ってくれませんか?

どちらか一方の正規表現を使用する必要がある場合もあれば、両方を一緒に使用する場合もあります。

4

4 に答える 4

3

両方の正規表現を検索するだけです。一般に、2つの正規表現のANDである正規表現を指定するのは良い方法ではありません。なぜなら...両方を実行するだけでよいからです。(後読み、先読み、連結を使用していくつかのことを試すことができますが、面倒になります)

メソッドで正規表現を1つしか渡せない場合は、2つ渡せる正規表現を記述してください。またはコレクション!または、これが一致するかどうかを好きなように判断できるコールバック-その場合、その中で正規表現を使用する必要さえないかもしれません!

于 2013-02-06T05:18:35.807 に答える
2

2 つの有効な正規表現文字列"A""B"がある場合、簡単に取得できる最も近いのは次の正規表現文字列です (引用符は正規表現の一部ではありません)。

"A.*B|B.*A"

A または B に が含まれている可能性がある場合|、おそらく次のような非キャプチャ グループを使用する必要があります (未テスト):

"(?:A).*(?:B)|(?:B).*(?:A)"

いくつかの Java コード:

Pattern regexpAnd(Pattern a, Pattern b) {
    return Pattern.compile(
         "(?:" + a.pattern() + ").*(?:" + b.pattern() + ")|"
       + "(?:" + b.pattern() + ").*(?:" + a.pattern() + ")" );
}

少なくとも高水準言語の標準正規表現ライブラリでは、それだけです。それ以上のものが必要な場合は、正規表現ライブラリ ソースを掘り出して (または独自に記述して)、コンパイルされた正規表現の解析/一致ツリーを結合する方法を追加してください。次に、結果のツリーから新しい正規表現文字列を生成します。しかし、要するに、それだけの価値はありません。

于 2013-02-06T05:29:12.993 に答える
1

|複数の正規表現を結合するために使用します。

だからそれは次のようになります

"eduId="+edu_id+"some_text"+"|"+"eduId="+edu_id+"|"+"some_text"
--------------------------  ---                 ---
         |->AND              |->OR               |->OR

たとえば、以下の正規表現では

a|b|c|abc

a または b または c または abc( AND) のいずれかが一致します

于 2013-02-06T04:57:06.677 に答える
1

find コマンドで RegExp を使用する必要があります - find(atDescendant(".documentName",RegExp)

次の行に沿ったコードを使用して、この問題を解決します。

TestObject[] results = find(atDescendant(".documentName",RegExp)
if (results.length == 0)
    results = find(atDescendant(".documentName",RegExp2)

適切にショートカットできるように、最も一般的なケースを最初に配置してください。


あなたが次のようにも言っていることに気付きました。

RegExp と RegExp2 の両方の結果が真である必要があります

その場合、上記の結果配列を反復処理して、各一致を 2 番目の正規表現と比較します。

TestObject[] results = find(atDescendant(".documentName",RegExp)
ArrayList<TestObject> potentials = new ArrayList<TestObject>;
for(TestObject candidate : results) {
    if (Regexp2.matches(candidate.getProperty(".documentName")))
       potentials.add(candidate);
}
于 2013-02-06T20:10:18.247 に答える