2009-05-21 27 views
1

我想寫一個簡單的SQL解析器來將一條sql語句分解成它的基本部分。但是,我遇到嵌套查詢問題。一個例子說明了最佳:VBScript正則表達式不貪心足夠

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含有 「的ID(選擇訂單,其中1 = 1 CUSTOMER_ID)」 和everything_else含有 「SELECT * FROM客戶」。也就是說,我希望它儘可能地貪婪,第二個(。*)和第一個無私。換句話說,我希望everything_else不包含任何地方。

不過,我得到everything_else = 「SELECT * FROM客戶那裏身份證件(從訂單中選擇CUSTOMER_ID」 和where_part = 「1 = 1)」

我怎麼能解決這個問題,而不求助於令人眼花繚亂的非正則表達式的字符串解析?

回答

8

恰恰相反,您的正則表達式太貪婪。

*捕獲最長的匹配字符串,直到您的示例中的第二個匹配字符串。

試試這個:

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

的?使得*表現得不那麼貪婪,意味着它會在第一次出現的地方停下來。

+0

完美的作品! – 2009-05-21 16:40:27