我认为以下正则表达式:
(?<!\(.*)\b(WHERE)\b|\b(WHERE)\b(?!.*\))
将匹配“WHERE”的任何实例:
- 出现在第一个左括号的左侧,或
- 出现在最后一个右括号的右侧。
即不会检测出现在(..)
.
它适用于我尝试过的几个测试用例......如果没有进一步澄清您的要求,我不会再做任何测试......
EG 下面,我用波浪号包围表示匹配的实例:~WHERE~
。
SELECT *
FROM products
~WHERE~ id NOT IN
(SELECT product_id FROM tagmap WHERE tag_id = 1 and (SELECT true WHERE something) );
SELECT x FROM y ~WHERE~ z = z;
SELECT Count(*)
FROM (Select rows FROM table WHERE filter)
~WHERE~ z
我强烈建议您在依赖它之前彻底测试它。
编辑:一个基本的.NET实现......因为我现在已经打开了VS......;-)
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
class Program
{
static void Main(string[] args)
{
StreamReader sr = new StreamReader("pathToSqlScript.sql");
string oldSQLString = sr.ReadToEnd();
string newSQLString = Regex.Replace(oldSQLString, @"(?<!\(.*)\b(WHERE)\b|\b(WHERE)\b(?!.*\))", @"WHERE 1=1 AND");
StreamWriter sw = new StreamWriter("newSqlScript.sql");
sw.Write(newSQLString);
}
}
编辑:要在文本编辑器中执行此操作...
Visual Studio 将允许您执行基于正则表达式的搜索/替换。我想像 Notepad++ 这样的东西会做到这一点(至少在插件的帮助下)。或者这可能会帮助你:http ://www.regular-expressions.info/editpadpro.html
否则,敲出一些会读取/修改您的文本文件的东西,例如使用 PHP、.NET、Java ......