0

私は修士論文のアプリケーションに取り組んでおり、その過程で 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

第二部のために

4

1 に答える 1

2
  • 文字クラスはグループではありません -- [&]前後のキーワードを削除してください。
  • 無駄なルックアラウンドを使用しないでください。場合によっては問題が発生する可能性があります。
  • で一致しない\bように、キーワードを前後に使用することをお勧めします。SELECTFOOSELECT
  • (?i)大文字と小文字を区別しない式にするために使用できます。

次のようなものを使用できます。

(?i)\bSELECT\b\s+(.+)\s+\bFROM\b\s+([\w\s,]+?)(?:\s+\b(?:WHERE|INNER|ORDER)\b|;?$)

関心のある部分は、1 番目と 2 番目のキャプチャ グループでキャプチャされます。

これは文字列では正しく機能しないことに注意してください。また、SQL は再帰的であり、Java 正規表現で解析するのはかなり困難です。SQL を適切に解析したい場合は、適切なパーサーを使用することをお勧めします。(正規表現を使用してトークンを生成し、Java を使用してトークンを解析し、解析ツリーを構築することで、簡単なものを自分で作成できます。)

于 2012-06-20T11:43:26.977 に答える