0

在我的 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 问题中,我得到了如何查找所有“ SELECT...”查询的答案,但我需要扩展该解决方案以找到不包含特定单词的那些。

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

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

我知道我非常接近解决方案,但仍然无法弄清楚。任何人都可以帮助我吗?(我在 Windows 上使用记事本++)

4

2 回答 2

3

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

第二个正则表达式的问题是匹配“选择,然后是一些东西,然后是任何与 MYWORD 不匹配的东西,然后是更多的东西,然后是分号”即使 MYWORD 存在,正则表达式引擎也会很高兴地匹配(?!MYWORD)到其他部分不是 MYWORD 的字符串。

像这样的东西应该可以工作(警告:未在 Notepad++ 上测试):

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

而不是.,匹配任何不是分号的东西。这应该允许您匹配换行符。

除此之外,您不允许分号成为匹配的一部分也很重要。SELECT否则,该模式可能会扩展以在尝试匹配时吞噬多个语句。

于 2012-12-17T14:42:07.877 回答
1

试试这个(在当前版本的 Notepad++ 上使用 Perl 兼容的正则表达式;旧版本不支持多行正则表达式):

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 回答