查找不包含特定单词的所有(多行)'SELECT ...'查询

时间:2012-12-17 13:58:41

标签: regex notepad++

在我的java文件中,有许多sql查询分配给java字符串,如:

/* ... */
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问题中我得到answer how to find all the 'SELECT...' queries,但我需要扩展该解决方案以找到那些不包含某些单词的解决方案。

我尝试了无法找到多行查询的正则表达式 SELECT(?!.*MYWORD).*; (如上面的 str3 ),只查找单行查询。

我还尝试了查找所有查询的正则表达式 SELECT[\s\S]*?(?!MYWORD).*(?<=;)$ ,但无法确定查询中是否存在“MYWORD”字样。

我知道我非常接近解决方案,仍然无法理解。 有人可以帮帮我吗? (我在Windows上使用notepad ++)

2 个答案:

答案 0 :(得分:3)

第一个正则表达式的问题是.与换行符不匹配。在正常的正则表达式中,有一个选项可以改变它,但我不知道在notepad ++中是否存在该功能。

第二个正则表达式的问题是匹配“select,然后是一些东西,然后是任何与MYWORD不匹配的东西,然后是更多的东西,然后是分号”即使MYWORD存在,正则表达式引擎也会很乐意匹配{{ 1}}到字符串中不是MYWORD的其他部分。

这样的事情应该有效(警告:未在Notepad ++上测试):

(?!MYWORD)

而不是SELECT(?![^;]*MYWORD)[^;]*; ,匹配任何不是分号的内容。这应该允许您匹配换行符。

除此之外,同样重要的是不要让分号成为匹配的一部分。否则,模式可以扩展为在尝试匹配时聚集多个.语句。

答案 1 :(得分: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.