2009-05-21 2 views
1

간단한 SQL 구문 분석기를 작성하여 SQL 문을 기본 부분으로 분리하려고합니다. 그러나 중첩 된 쿼리에 문제가 있습니다. 여기VBScript RegExp Greedy 충분하지 않습니다.

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가와 EVERYTHING_ELSE 포함 "고객 SELECT * FROM"을 "(1 = 1이 주문에서 CUSTOMER_ID 선택)에서 ID"를 포함 할 : 예를 가장 잘 보여줍니다. 즉, 나는 그것이 가능한 한 탐욕스럽고, 두 번째 (. *)는 탐욕스럽고 첫 번째는 사심없는 욕심을 갖기를 바란다. 다른 방법으로 말하자면, everything_else가 어디에 들어 있지 않았 으면합니다.

그러나, 나는 "고객 SELECT * FROM 곳에서 ID (주문에서 CUSTOMER_ID을 선택"EVERYTHING_ELSE = 얻고 where_part = "1 = 1)"

나는 비 정규 표현식 문자열을 혼란에 의지하지 않고이 문제를 해결할 수있는 방법 파싱?

답변

8

반대로, 당신의 정규 표현식은 너무 욕심이 있습니다.

. *는 가능한 가장 긴 일치하는 문자열을 캐치합니다.

대신이 시도

:

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

를? . *을 덜 탐욕스럽게 행동하게 만듭니다. 즉, 처음 발생하는 곳에서 멈출 것입니다.

+0

완벽하게 작동합니다. –

관련 문제