0

大文字を含むいくつかの列を含む SQL クエリが与えられた場合、大文字を含むが SQL キーワードを含まない単語を検索するにはどうすればよいですか。たとえば、次のようになります。

SELECT ... ,
    table1.thisColumn AS column,
    ...
    FROM table1

私はこのようなものを構築するために成功せずに試みました:

(?!AS+FROM+LEFT+JOIN+ON)[A-Z]{2,}
4

1 に答える 1

2

既存の正規表現について注意すべき点が 2 つあります。

  1. 例外リストの「または」演算子は、では|なく、である必要があり+ます。は+実際の文字として扱われますが、この場合は必要に応じ|て正規表現エンジンに「左」または「右」を伝えます。
  2. 少なくとも 1 つの大文字を含む完全な単語を一致させるには、実際には小文字もチェックする必要がありますが、少なくとも 1 つの大文字が「必要」です。

私は次のことを思いつきました:

(?:^|\.|[\t ])(?!AS|FROM|LEFT|JOIN|ON)([a-z0-9]*[A-Z][a-zA-Z0-9]+)

サンプル クエリに対してこれをテストし、他のランダムな SQL も追加しました (展開されたフィールド リスト、WHERE句など)。少なくとも 1 つの大文字を含み、無視するキーワードのリストに含まれていない各単語が正常に検出されました。

Find Nextまたはを介し​​て単に「検索」するためにこれを使用している場合Find All in Opened|Current Documents、一致する単語とその前.のまたは空白文字が強調表示されます。

これを「置換」するために使用している場合、一致した単語 (前.の空白文字または空白文字を除く) は、\1一致を介して使用/アクセスできます。

正規表現の説明:

(?:                         # non-matching group;
                            # a "word" is required to be preceeded by one of the following
    ^                       # beginning of line
    |\.                     # period
    |[\t ]                  # tab or space;
                            # note: we don't use the \s here because a newline will break notepadd++'s "find all" feature
)

(?!AS|FROM|LEFT|JOIN|ON)    # list of words to ignore

(                           # group to match
    [a-z0-9]*               # word can start with lowercase a-z or 0-9
    [A-Z]                   # required uppercase letter
    [a-zA-Z0-9]+            # word can end with lowercase/uppercase a-z or 0-9
)

また、欠落している SQL キーワード (必要な場合) を追加したり、「単語にこれらの文字を含めることができる」リストに許可されているその他の文字を追加したりすることもできます。

于 2012-08-07T15:54:45.550 に答える