1

次のような式からテーブル名とエイリアスを抽出するには、正規表現が必要です。

INNER JOIN dbo.table1 t ON t.x = table n.y
INNER JOIN table2 on table2.x = table n.y
INNER JOIN table3 t3 on t3.x = tablen.y

上記のクエリから、次をキャプチャしたいと思います。

(Table Name, Alias)
table1, t
table2, " " <-- No alias specified so blank or null
table3, t3

テーブルを指定するには、次の方法があります。

  1. dbo.table1 などの所有者の有無にかかわらず
  2. エイリアスの有無にかかわらず

いずれにせよ、私が気にするのはテーブル名とエイリアスだけです。

違いが生じる場合に備えて、クエリは SQL Server データベースに対して行われ、C# アプリケーション内で使用されます。

私は、Regex Match コレクションの Matches と RegEx グループを反復処理することに精通しています。使用する適切な正規表現のみに苦労しています。

4

2 に答える 2

2

正規表現は、SQLのような文脈自由言語を解析するのに十分強力であると想定しています。

そうではありません。

あなたはあなたの戦略、したがってあなたの質問を完全に再考する必要があります。

認識されているパーサジェネレータの1つ、たとえばYACC / Bison、ANTLR、JavaCCなどでSQLパーサを探します...

于 2012-06-11T11:11:41.787 に答える
2

あなたが使用することができます:

(?i)\bJOIN\s+([\w.]+)(?:\s+(?!ON\b)(\w+))?

ただし、内容が一致する文字列を引用した場合など、無効な結果になる可能性があることに注意してください。そのような場合、正規表現の代わりに適切な SQL パーサーを使用する方がよいでしょう。

于 2012-06-11T11:09:28.663 に答える