VBScript RegExp不够贪婪

时间:2009-05-21 16:31:29

标签: regex parsing vbscript regex-greedy

我正在尝试编写一个简单的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包含“id in(从订单中选择customer_id,其中1 = 1)”和everything_else包含“select * from Customers”。也就是说,我希望它尽可能地贪婪,第二个(。*)和第一个无私。换句话说,我希望everything_else不包含任何地方。

但是,我得到了everything_else =“select * from Customers in id in(select order_id from Orders”and where_part =“1 = 1)”

如何在不诉诸凌乱的非regexp字符串解析的情况下解决这个问题?

1 个答案:

答案 0 :(得分:8)

相反,你的正则表达式太贪心了。

。*捕获最长的匹配字符串,直到你的例子中的第二个字符串。

请改为尝试:

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

?使。*表现得不那么贪婪,这意味着它会在第一次出现时停止。