2017-05-05 10 views
2

SQL(JDBC)クエリのすべてのパラメータと関連する値をキャッチするためにRegExpを作成しました。SQL文字列のIN値を見つけるためのRegExp

私はこれを使用しています。私のようなパラメータをキャッチできるようにするため

(?:\S+\s)?\S*"myOperatorHere\S*(?:\s\S+)? 

Where c.value = 32

を私はc.valueを得ることができますし、32

それは私がwhere c.value IN (3,4,5,6)をキャッチしたいと思いますIN

を除くすべての演算子とうまく動作します

しかし、この式では、01たとえば、代わりに(3,4,5,6)

の値として私は、クエリがある場合:

SELECT C.NAME, C.FIRSTNAME FROM CUSTOMER C, PROSPECT P WHERE C.ID = 32 AND C.TRUC = 28 AND P.ID < 12 AND P.A IN (2, 3, 4) 

を私はC.ID = 32, C.TRUC = 28, P.ID < 12, P.A IN (2, 3, 4)

を取得したいのですが、あなたは私がこれを管理しやすくしてくださいもらえますか?必要に応じて2つの式を使用できます。

答えて

1

2番目のグループの有効な文字の範囲を開くことができると思います。 私はあなたのオペレータリストのすべてのオプションも書いています。

Demo Link

(?:\S+\s)?\S*(?:IN|[<=>]+)\s(?:(?:\([^)]+\))|\S+) 

パターンの内訳:

(?:     #non-capture group 
    \S+\s   #1 or more non-white characters then a white character 
)?     #end non-capture group, zero or one occurrence of the group 
\S*     #zero or more non-white characters 
(?:     #non-capture group 
    IN|[<=>]+  #literally match "IN" or one or more of any operator symbols in range 
)     #end non-capture group 
\s     #whitespace character 
(?:     #non-capture group 
    (?:    #non-capture group 
     \([^)]+\) #open parenthesis, anything not a close parathensis, close parenthesis 
    )    #end non-capture group 
    |    #or 
    \S+    #one or more non-whitespace characters 
)     #close non-capture group 

編集:私は出力に損傷を与えることなく、私のパターンのオフいくつかのステップと文字をトリミングすることができました:

\S+ (?:IN|[<=>]+) (?:\([^)]+?\)|\S+) 

これはあなたが求めたすべてのものと一致します。

New Demo

+0

おかげで、ほとんどの作業。しかし、私は問題の説明に追加したSQLの例ではない – Gilles

+0

それは素晴らしいです。ありがとうございます。 – Gilles

0

私はあなたが実際にこのwhere c.value IN (3, 4, 5, 6)(カンマの後のスペースに注意してください)などの入力に問題がある、と信じています。

もしそうなら、スカラー値用とリスト用の2つのパターンを使用し、これらのいずれかを変更して使用することをお勧めします。後者は、コンマで区切られた非スペースのシーケンスと、場合によってはいくつかのスペースと、括弧で囲まれたリスト全体(すなわち、\(s*\S+\s*(?:,\s*\S+\s*)*\))と定義することができます。そして、全体の正規表現:

(?:\S+\s)?\S*"myOperatorHere\S*(?:\s(?:\(s*\S+\s*(?:,\s*\S+\s*)*\)|\S+))? 

デモ:https://regex101.com/r/YUtuty/1

+0

ありがとうございます。これは、IN値にスペースがない場合に機能します。 myoperator:=または<または<= ...またはINを使用しています。 INにスペースを入れる可能性をどのように追加することができますか?IN(2,3,4) – Gilles

+0

@ Gilles:おっと、私の悪い、すみません。交替にはリストが最初に、その後に '\ S +'がなければなりません。答えを修正しました。 –

+0

ありがとう – Gilles

関連する問題