VBScript RegExp не достаточно жадный - PullRequest
2 голосов
/ 21 мая 2009

Я пытаюсь написать простой синтаксический анализатор 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 = "select * from Customers" с идентификатором (выберите customer_id из Orders "и where_part =" 1 = 1) "

Как я могу исправить это, не прибегая к беспорядочному разбору строк без регулярных выражений?

1 Ответ

8 голосов
/ 21 мая 2009

Напротив, ваше регулярное выражение слишком жадное.

. * Перехватывает самую длинную из возможных совпадающих строк, пока в вашем примере не будет второй секунды.

Попробуйте вместо этого:

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

? заставляет. * вести себя менее жадно, что означает, что он остановится в первом месте, где возникнет.

...