Regex для извлечения информации из SQL-запроса

Поскольку я новичок в REGEX, я не могу решить проблему ниже.

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

Я столкнулся с проблемой в решении int ниже инструкции SQL. Его дополнительная строка добавлена ​​к предыдущему INPUT.

Пожалуйста, помогите мне это сделать.

DECLARE
numerator   NUMBER;
BEGIN
SELECT x, y INTO numerator, denominator FROM result_table, s_Table
WHERE sample_id = 8;
the_ratio := numerator/denominator;
IF the_ratio > lower_limit THEN
INSERT INTO 
ratio VALUES (table, coloum);
ELSE
INSERT INTO onemoreTable VALUES (table, -1);
END IF;
COMMIT;
delete from     --some comment
xyz where id=17;
EXCEPTION
WHEN ZERO_DIVIDE THEN
INSERT INTO ratio VALUES (table, 0);
COMMIT;
WHEN OTHERS THEN
ROLLBACK;
END;

ВЫХОД:

SELECT from: result_table, s_Table
INSERT into: ratio
INSERT into: onemoreTable
DELETE from: xyz
INSERT into: ratio

person vrbilgi    schedule 25.08.2010    source источник
comment
Подлый, с комментарием там. Для реального SQL существуют более сложные сценарии, и вам, вероятно, понадобится анализатор SQL. Что это за язык вообще?   -  person Kobi    schedule 25.08.2010
comment
Я согласен с Коби, если вы не можете гарантировать очень простые запросы, вам, вероятно, лучше всего получить правильный синтаксический анализатор SQL.   -  person Craig    schedule 25.08.2010


Ответы (1)


Вот решение на основе Perl с использованием регулярных выражений:

$input =~s/--.*?\n//g; # delete the comments.
$input =~s/\s+/ /g; # replace multiple white space with single space.
while($input=~m/((?:insert into)|(?:delete from)) (\w+)/ig) { 
        print "$1 : $2\n";    
}

Правильный способ парсить SQL — делать это с помощью синтаксического анализатора, а не с помощью регулярных выражений.

person codaddict    schedule 25.08.2010
comment
Спасибо codadict, ваше решение мне очень помогло. - person vrbilgi; 02.09.2010