2017-07-03 30 views
0

非常に特殊なことをするパターンが必要ですが、数時間後には期待した結果が得られません。VBScript正規表現のパターン

サンプル文字列:

SELECT col1 FROM tbl1 WHERE col1 = (SELECT col2 FROM tbl2 WHERE col2=col2) 

期待される結果:

FROM tbl1 WHERE col1 = (SELECT col2 FROM tbl2 WHERE col2=col2) 

    -> tbl1 
    -> WHERE col1 = (SELECT col2 FROM tbl2 WHERE col2=col2) 

実際のパターン:

FROM\s+([^\s,]+)[\s\S]+(WHERE[\s\S]+) 

実際の結果:

FROM tbl1 WHERE col1 = (SELECT col2 FROM tbl2 WHERE col2=col2) 

    -> tbl2 
    -> WHERE col2=col2) 

先読みなどを使ってみましたが、最初の 'WHERE'からグループ化することはできません。

注: 'tbl1'と 'WHERE'の間には、スペースだけでなく、すべてのものが一致する必要があります。

注2:後でどこにもない場合でも、最初の 'WHERE'の後にすべてをグループ化する必要があります。

+0

あなたは、代表入力/出力ペアのとでリストを公表すべきですマッチオブジェクトからの出力を生成する戦略には少なくともヒントがあります。 –

+1

なぜVB6タグですか? – DaveInCaz

答えて

1

詳細が公開されるまで、私は非欲張りパターンで問題を解決することを主張する:

Option Explicit 

Dim r : Set r = New RegExp 
'r.Pattern = "FROM\s+([^\s,]+)[\s\S]+(WHERE[\s\S]+)" 
r.Pattern = "FROM\s+([^\s,]+)[\s\S]+?(WHERE[\s\S]+)" 
'Dim s : s = "SELECT col1 FROM tbl1 WHERE col1 = (SELECT col2 FROM tbl2 WHERE col2=col2)" 
Dim s : s = "SELECT col1 FROM tbl1 WHERE col1 = (No W h e r e here)" 
Dim m : Set m = r.Execute(s) 
If 1 = m.Count Then 
    Dim t : t = Join(Array("From", m(0).SubMatches(0), m(0).SubMatches(1), _ 
          vbCrLf, vbCrLf, "->", m(0).SubMatches(0), vbCrLf, "->", m(0).SubMatches(1))) 
    WScript.Echo s 
    WScript.Echo t 
Else 
    WScript.Echo "no match" 
End If 

出力:

cscript 44890052.vbs 
SELECT col1 FROM tbl1 WHERE col1 = (No W h e r e here) 
From tbl1 WHERE col1 = (No W h e r e here) 

-> tbl1 
-> WHERE col1 = (No W h e r e here) 
+0

2番目の「どこで」でもうまくいきました。どうも! – MauriF