私は修士論文のアプリケーションに取り組んでおり、その過程で SQL パーサーを構築する必要があります。そうするために、私は正規表現に力を入れることに決めました。
問題は、正規表現に小さな問題があることです。
次のようないくつかのクエリの例を検討してください。
select
RIC
from
(select
s.RIC, m.NAME
from
Stock s, Market m
where
s.LISTED_ON_EXCHANGE = m.RIC) t
where
RIC > 'G';
select *
from Stock
order by COMPANY
LIMIT 0,2;
select 1+2;
select now();
select
s.RIC, m.NAME
from
Stock s
INNER JOIN
Market ON m I s.LISTED_ON_EXCHANGE = m.RIC;
select *
from Stock
order by COMPANY;
select *
from Stock
where RIC in ('GS.N' , 'INFY.BO');
select *
from Stock
where RIC LIKE 'V%';
select *
from Stock
where RIC BETWEEN 'G' AND 'I';
select count(*)
from STOCK
where LISTED_ON_EXCHANGE IS NOT NULL;
select na_me as n, price as p
from bla, blabla, blalalaa;
そして、次の 2 つの正規表現が与えられます。
SELECT_FIELDS_PATTERN = "(?<=[SELECT]) [\\d\\w',.*() ]+ (?=FROM)";
それは選択フィールドと一致する必要があります。
と:
SELECT_FROM_PATTERN = "(?<=[FROM]) [\\w, ]+ (?(?=(?:WHERE|INNER|ORDER)))";
これは、条件や順序などを除いて FROM 句と一致する必要があります。
を除くすべてのクエリ
select 1+2;
select now();
有効である必要があります。これは、関連する情報を含む選択クエリのみを解析したいためです。
問題は、私が作成した 2 つの正規表現が、たとえば最後のクエリを検証しないことです。
select na_me as n, price as p from bla, blabla, blalalaa;
したがって、選択クエリの正規表現を改善するには、いくつかの助けが必要です.2つの正規表現をマージすることさえありますか?
最初のクエリの正しい出力の例:
select RIC from (select s.RIC, m.NAME from Stock s, Market m where s.LISTED_ON_EXCHANGE=m.RIC) t where RIC > 'G';
出力は次のようになります。
リック
最初の部分と
(s.LISTED_ON_EXCHANGE=m.RIC である Stock s、Market m から s.RIC、m.NAME を選択) t
第二部のために