2

私は、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)"を取得します。

面倒な非正規表現の文字列解析に頼らずに、これを修正するにはどうすればよいですか?

4

1 に答える 1

9

それどころか、あなたの正規表現はあまりにも貪欲です。

。*は、可能な限り最長の一致する文字列をキャッチします。これは、例の2番目までです。

代わりにこれを試してください:

^(.*?)\swhere\s(.*)

?。*の動作をあまり貪欲にしないようにします。つまり、最初に発生した場所で停止します。

于 2009-05-21T16:35:19.023 に答える