2009-05-21 7 views
1

J'essaie d'écrire un simple analyseur sql pour casser une déclaration SQL dans ses parties de base. Cependant, j'ai un problème avec les requêtes imbriquées. Un exemple illustre le mieux:VBScript RegExp pas Greedy Enough

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>" 

Ici, je veux le where_part contenir "id dans (sélectionnez customer_id de commandes où 1 = 1)" et everything_else pour contenir "select * from clients". C'est-à-dire que je veux qu'il soit aussi gourmand que possible, pour le second (. *) Et altruiste pour le premier. Ou en d'autres termes, je veux que le tout_else ne contienne aucun endroit.

Cependant, je reçois everything_else = "select * from clients où id dans (sélectionnez customer_id de commandes" et where_part = "1 = 1)"

Comment puis-je remédier à cette situation sans avoir recours à malpropre chaîne non regexp analyse?

Répondre

8

Au contraire, votre expression rationnelle est trop gourmande.

. * Capture la chaîne la plus longue possible, jusqu'à la seconde où dans votre exemple.

Essayez ceci:

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

Le? fait en sorte que. * se comporte moins goulûment, ce qui signifie qu'il s'arrêtera à la première occurrence.

+0

fonctionne parfaitement! –