0

ログ エントリがあり、正規表現を使用して SQL ステートメントを抽出したいだけです。SQL ステートメントは任意の DDL または DML ステートメントであり、複数の行が含まれる場合があります。Params セクションが欠落している可能性があり、"Got xx Results in xx Ticks" も欠落している可能性があります。しかし、「:SQLEnd:」行は常にそこにあります。下記は用例です

SELECT col1, col2 FROM table WHERE col1 = :id and col2= :num ORDER BY ORDERID ASC

Params:
:id -> 60081
:num-> 1

Got 2 Results in 0 Ticks
:SQLEnd:

また:

SELECT col1, col2 FROM table WHERE col1 = :id and col2= :num ORDER BY ORDERID ASC

Got 2 Results in 0 Ticks
:SQLEnd:

また:

SELECT col1, col2 FROM table WHERE col1 = :id and col2= :num ORDER BY ORDERID ASC

Params:
:id -> 60081
:num-> 1

:SQLEnd:

また:

SELECT col1, col2 FROM table WHERE col1 = :id and col2= :num ORDER BY ORDERID ASC

:SQLEnd:
4

2 に答える 2

0

あなたの例に一致する基本的な正規表現は次のようになります。

SELECT .+?:SQLEnd:

.が改行文字と一致することを確認する必要があります。PHP では、これは次のようになります。

/SELECT .+?:SQLEnd:/s

ただし、この正規表現は、特定の SQL クエリ (1 つ以上のSELECTサブクエリを含むクエリなど) で使用すると壊れる可能性があるため、あまり堅牢ではありません。そして、「任意の DDL または DML ステートメント」と一致させたいと考えていますが、これは正規表現では非常に複雑です。マークが言うように、正規表現よりもパーサーを使用する方が良いでしょう。

編集

C#.net では、次を使用します。

new Regex("SELECT .+?:SQLEnd:", RegexOptions.Singleline);

のドキュメントRegexOptions.Singlelineは次のとおりです。

シングルライン モードを指定します。ドット (.) の意味を変更して、(\n を除くすべての文字ではなく) すべての文字に一致するようにします。

このインライン オプションを使用して、単一行モードを有効にすることもできます。

new Regex("(?s)SELECT .+?:SQLEnd:");
于 2012-11-28T17:42:22.907 に答える
0

Mark Thalman がコメントで述べたように、おそらくこれに適したパーサーを調査したいと思うでしょう。使用する言語をカバーするさまざまなパーサーが利用可能です。

http://code.google.com/p/python-sqlparse/ (たとえば) は、Python SQL パーサーの良い例です。

あなたの質問に答えるには、正規表現を使用します。

'(s?)(m?)(.*?^:SQLEnd:)'

これは、任意の DDL/DML ステートメントに一致しますが、大雑把に一致します (以下で説明します)。

先頭のフラグは、DOTALL (ドットはすべての文字を表す) と MULTILINE ($ と ^ は行の終わりと始まりを表す) を示します。ほとんどの言語には、実装する正規表現クラスを使用してアクティブ化できるフラグが組み込まれています。(つまり、Pythonre.DOTALLre.MULTILINEfrom import re.

この正規表現は、":SQLEnd:" のインスタンス間の式のみを取得することに注意してください。

SELECT col1, col2 FROM table WHERE col1 = :id and col2= :num ORDER BY ORDERID ASC

Params:
:id -> 60081
:num-> 1

Got 2 Results in 0 Ticks
:SQLEnd:

1つのグループになり、

or:

SELECT col1, col2 FROM table WHERE col1 = :id and col2= :num ORDER BY ORDERID ASC

Got 2 Results in 0 Ticks
:SQLEnd:

別のものになります。これは大雑把ですが (ただし、DDL/DML ステートメントを簡単に説明するために私が考えることができる唯一の方法です)、うまくいけばうまくいくでしょう。これがオプションでない場合は、SQL パーサーを強くお勧めします。

于 2012-11-28T17:58:53.797 に答える