在我的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 ++)
答案 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.