【发布时间】:2012-08-07 14:45:24
【问题描述】:
给定一个包含大写字母的列的 sql 查询,我如何搜索包含大写字母但不包含 SQL 关键字的单词,例如:
SELECT ... ,
table1.thisColumn AS column,
...
FROM table1
我尝试过构建这样的东西,但没有成功:
(?!AS+FROM+LEFT+JOIN+ON)[A-Z]{2,}
【问题讨论】:
给定一个包含大写字母的列的 sql 查询,我如何搜索包含大写字母但不包含 SQL 关键字的单词,例如:
SELECT ... ,
table1.thisColumn AS column,
...
FROM table1
我尝试过构建这样的东西,但没有成功:
(?!AS+FROM+LEFT+JOIN+ON)[A-Z]{2,}
【问题讨论】:
关于您现有的正则表达式有两点需要注意。
| 而不是+。 + 将被视为实际字符,而 | 将告诉正则表达式引擎“左”或“右”,如您在本例中所希望的那样。我想出了以下几点:
(?:^|\.|[\t ])(?!AS|FROM|LEFT|JOIN|ON)([a-z0-9]*[A-Z][a-zA-Z0-9]+)
我针对您的示例查询对此进行了测试,并向其中添加了其他随机 SQL(例如扩展字段列表、WHERE 子句等)。它成功地找到了每个包含至少一个大写字母并且不在要忽略的关键字列表中的单词。
如果您使用它只是通过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 关键字(如果需要)或其他允许的字符。
【讨论】: