2

Eclipse で開いたファイルに次の文字列があるとします。

$stmt = "select addr from 
         student
         where id=123";

$stmtA = "alter table tablename";

$stmtB = " delete from student
    where school=ABC";

$var1 = "This is not a query.
         Just a string";

Student テーブルと school 列に影響するすべてのクエリ ステートメントを見つける必要があります。で検索:

(?s)"(.*?)"

引用され、複数行にまたがるすべての文字列を教えてくれます。上記の正規表現を拡張して結果をフィルタリングし、結果が確実に得られるようにするにはどうすればよいですか

1) MySQL のキーワードの選択、変更、挿入、または削除、および 2) 学生および学校の​​キーワード。

上記の 2 つの条件が満たされれば、学生のテーブルと学校の列にヒットする文字列を抽出できると思います。何か助けはありますか?

4

1 に答える 1

2
(?s)".*?(?:select|alter|insert|delete).*?(?:student|school).*?"

[^"]*?の代わりに使用する.*?方が良いかもしれませんが。

編集:いくつかの条件 (文字列の長さ、特別な char または smthg を持つ) を確保するときに非常にクールなツールであるため、先読み
に 切り替えましょう。

(?s)".*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"

正規表現に興味がない場合は、ここで終了できます。それ以外の場合は、先読みの例として (注: これは遅いです):

(?s)"(?=[^"]*?(?:select|alter|insert|delete)(?=[^"]*?student)(?=[^"]*?school).*?"

アトミック グループにアクセスできる場合は、常にこれを実行することをお勧めします (アトミック グループ化)。

(?>select|alter|insert|delete)

最初の文字の後に 1 つの単語が一致しないかのように、残りの単語はスキップされます (すべて最初の文字が異なります)。

最後に、 if/then/elseを使用できると思います:

(?s)".*?(?:select|alter|insert|delete).*?(?:(student)|school)(?(1).*?school|.*?student).*?"

または似たようなもの。

于 2013-04-02T11:41:40.603 に答える