1

Java を使用したコマンド ライン インターフェイスを持つ SQL 構文でリレーショナル データベースを作成しています。ユーザーコマンドを解析するために、私は正規表現を使用しています (それがひどい考えであることはわかっています - それは何よりも学ぶべきことです
)私の正規表現で。このようにして、複数行の入力を処理できます。入力は正規表現と照合される前にトリミングされるため、文字列の先頭と末尾の空白は正規表現の一部ではありません。

where句にオプションのフラグを追加するまで、私が望むように機能するこの正規表現をここに持っています-

select\s+(.*?)(?:\s+where(.*))

それは一致します(グループは太字になっています)-

* から a を選択( x = 3 )

しかし、正規表現をこれに変更すると -

select\s+(.*?)(?:\s+where(.*))?

引用部分のみに一致します-

"select "a from * where x = 3

私の目標は、前後に空白文字が続く文字列「where」がない限り、「select」という単語の後の文字列の最後まですべてに一致させることです(空白文字を含む)。それが存在する場合は、'select' と 'where' という単語の間のすべての文字をグループ化し、'where' という単語の後のすべての文字もグループ化します。

例: このテキストが入力された場合:

select a from * where b = 3

「 a from * 」と「 b = 3 」をグループ化する必要があります。

しかし、これが入力だった場合:

select a where x = 3

テーブル名 "a" はグループで、where 句 "x = 3" はグループである必要があります。

私が java.util.regex を使用していることに注意することが重要です。Perl 正規表現のように if/else 句はありませんが、グループ内の or ステートメントを使用した先読みを使用して同じ効果を得ることができます。if/then/else ステートメントをサポートする別のライブラリを使用できますが、それを使用して探している結果を達成できるかどうかわかりません。

4

1 に答える 1

1

正規表現を使用して SQL を解析することは、正規表現を使用してHTML を解析することと大差ありません。つまり、うまくいきません。それは絶望的な仕事です、今すぐやめてください。

代わりに、何らかの SQL パーサーを使用してください。たとえば、Perl の場合はSQL::Statement::Structure、Java の場合はANTLRです。

また、独自のデータベースを作成しているので、他の SQL 実装がどのようにそれを行っているかを調べる価値があります。PostgreSQLまたはMySQLのソース コードを読んで、高度な SQL 解析がどのように実装されているかを確認することをお勧めします。

于 2013-09-04T03:48:51.937 に答える