0

私のJavaファイルには、次のようなJava文字列に割り当てられた多くのSQLクエリがあります。

/* ... */
String str1 = "SELECT item1, item2 from table1 where this=that and MYWORD=that2 and this3=that3";
/* ... */
String str2 = "SELECT item1, item2 from table1 where this=that and" + 
                " MYWORD=that2 and this3=that3 and this4=that4";
/* ... */
/* ... */
String str3 = "SELECT item1, item2 from table2 where this=that and this2=that2 and" +
                " this3=that3 and this4=that4";
/* ... */
String str4 = "SELECT item1, item2 from table3 where this=that and MYWORD=that2" +
                " and this3=that3 and this4=that4";
/* ... */
String str5 = "SELECT item1, item2 from table4 where this=that and this2=that2 and this3=that3";
/* ... */

ここで、「MYWORD」という単語を含まない「SELECT ...」クエリを見つけたいと思います。

以前の S/O の質問の 1 つから、すべての ' SELECT...' クエリを見つける方法の答えを得ましたが、その解決策を拡張して、特定の単語を含まないものを見つける必要があります。

SELECT(?!.*MYWORD).*;複数行のクエリ(上記のstr3など)を見つけることができず、単一行のクエリのみを見つける正規表現を試しました。

また、すべてのクエリを検索する正規表現を試しましたSELECT[\s\S]*?(?!MYWORD).*(?<=;)$が、クエリに「MYWORD」という単語が存在するかどうかを判断できません。

私は解決策に非常に近いことを知っていますが、まだそれを理解することはできません. 誰でも私を助けてもらえますか?(Windowsでメモ帳++を使用しています)

4

2 に答える 2

3

最初の正規表現の問題は.、改行と一致しないことです。通常の正規表現では、それを変更するオプションがありますが、その機能が notepad++ に存在するかどうかはわかりません。

2番目の正規表現の問題は、「選択、次にいくつかのもの、次にMYWORDと一致しないもの、さらに多くのもの、そしてセミコロン」に一致することです.MYWORDが存在する場合でも、正規表現エンジンは喜ん(?!MYWORD)でMYWORD ではない文字列。

このようなものが動作するはずです (注意: Notepad++ ではテストされていません):

SELECT(?![^;]*MYWORD)[^;]*;

の代わりに.、セミコロン以外のものに一致します。これにより、改行に一致させることができます。

さらに、セミコロンを一致の一部にしないことも重要です。そうしないと、パターンが拡張さSELECTれて、一致しようとするときに複数のステートメントを飲み込む可能性があります。

于 2012-12-17T14:42:07.877 に答える
1

これを試してください(Perl互換の正規表現を使用するNotepad ++の現在のバージョンでは、古いバージョンは複数行の正規表現をサポートしていません):

SELECT (?:(?!MYWORD)[^"]|"\s*\+\s*")*"\s*;

説明:

SELECT       # Match SELECT
(?:          # Match either...
 (?!MYWORD)  #  (as long as it's not the word MYWORD)
 [^"]        #  any character except a quote
|            # or
 "\s*        #  an ending quote, optional whitespace,
 \+\s*       #  a plus sign, optional whitespace (including newlines),
 "           #  and another opening quote.
)*           # Repeat as needed.
"\s*;        # Match a closing quote, optional whitespace, and a semicolon.
于 2012-12-17T14:42:09.833 に答える