私は、SQLステートメントを基本的な部分に分割するための単純なSQLパーサーを作成しようとしています。ただし、ネストされたクエリに問題があります。例は最もよく説明します:
sql = "select * from Customers where id in (select customer_id from Orders where 1=1)"
Set re = New RegExp
re.IgnoreCase = True
re.Pattern = "^(.*)\swhere\s(.*)$"
re.Global = True
Set matches = re.Execute( sql )
If matches.count > 0 Then
Set submatches = matches(0).Submatches
where_part = Trim(submatches(1))
everything_else = Trim(submatches(0))
End If
Response.Write where_part & "<br>"
Response.Write everything_else & "<br>"
ここでは、where_partに「idin(select customer_id from Orders where 1 = 1)」を含め、everything_elseに「select*fromCustomers」を含めます。つまり、2番目(。*)はできるだけ貪欲に、最初は無私無欲にしたいと思います。言い換えれば、everything_elseにwhereが含まれないようにする必要があります。
ただし、everything_else = "select * from Customers where id in(select customer_id from Orders" and where_part = "1 = 1)"を取得します。
面倒な非正規表現の文字列解析に頼らずに、これを修正するにはどうすればよいですか?