2

クエリ パラメータの次の条件に一致する正規表現を見つけようとしています。テキストにandoror演算子がクエリ パラメータで渡されているかどうかを確認する必要があります。次のようなURIを持つことができますhttp:$URL/$RESOURCE?$filter="firstName eq 'John' and tenantId eq '32323232'"&$order="asc.

テキスト 1:firstName eq 'John' and tenantId eq '32323232'
テキスト 2:firstName like 'J%' or companyName eq 'IBM'
テキスト 3:companyName like 'John and Sons'

次の正規表現パターンはテキスト 1 とテキスト 2 に対して機能しますが、テキスト 3 を除外する方法が必要です。値は常に引用符で囲む必要があるため、引用符で囲まれた値andまたはor値は正規表現で無視する必要があります。テキスト 3 のようなケースを除外するための助けをいただければ幸いです。ありがとう

public static boolean hasANDorORoperator(String filter) {
    return filter.matches("^(.*?)\\s+(?i)(or|and)\\s+(.*?)$");
}
4

3 に答える 3

3
(and|or)(?=(?:[^']*'[^']*')*[^']*$)

andまたはor偶数の引用符が続く場合にのみ一致します。したがって、文字列内にいる場合、その条件が満たされないため、一致は失敗します。

regex101 で参照してください

説明:

(and|or)  # Match and/or.
(?=       # only if the following can be matched here:
 (?:      # Start of non-capturing group:
  [^']*'  # Match any number of non-quote characters plus a quote
  [^']*'  # twice in a row.
 )*       # Repeat any number of times, including zero.
 [^']*    # Match any remaining non-quote characters
 $        # until the end of the string.
)         # End of lookahead assertion.
于 2013-11-12T21:58:21.867 に答える
1

私があなたなら、テキスト 3 の例のように、最初にすべての文字列を引き出します。最初に「John and Sons」を除外します。

そうすると、 (.*)\s+(and|or)\s+(.*) 正規表現と一致する生のコマンドだけが残ります。

そうすれば、結果の複雑な正規表現に対処する必要がなくなります。

于 2013-11-12T22:11:47.600 に答える
0
/^((.*)('[^']')?)*(and|or)[^']*$/i

トリックを行う必要があります。end/or に一致する前に括弧内に何かをキャプチャしているため、end/or に一致する可能性はありません。ほとんどの正規表現エンジンは、後のキャプチャ グループに一致するようにバックトラックするためno '、最後に を含めました。

于 2013-11-12T21:59:54.640 に答える