0

给定一个包含大写字母的列的 sql 查询,我如何搜索包含大写字母但不包含 SQL 关键字的单词,例如:

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

我尝试过构建这样的东西但没有成功:

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

1 回答 1

2

关于您现有的正则表达式需要注意两点。

  1. 例外列表中的“或”运算符应该是 a|而不是 a +。将+被视为实际字符,而在这种情况下,|它将告诉正则表达式引擎“左”“右”。
  2. 要匹配包含至少一个大写字母的完整单词,您实际上还需要检查小写字母 - 但“要求”至少一个大写字母。

我想出了以下几点:

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

我针对您的示例查询对此进行了测试,并向其中添加了其他随机 SQL(例如扩展字段列表、WHERE子句等)。它成功地找到了每个包含至少一个大写字母并且不在要忽略的关键字列表中的单词。

如果您使用它只是通过Find Nextor进行“搜索” 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 回答