次の正規表現だと思います。
(?<!\(.*)\b(WHERE)\b|\b(WHERE)\b(?!.*\))
「WHERE」のすべてのインスタンスに一致します。
- 最初の開き括弧の左側にある、または
- これは、最後の閉じ括弧の右側にあります。
つまり、内で発生するWHEREのインスタンスは検出されません(..)
。
それは私が試したいくつかのテストケースで機能しました...そして私はあなたの要件をさらに明確にすることなしにこれ以上のテストをするつもりはありません...
以下の例では、チルダで囲むことにより、一致するインスタンスを示しています~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などを使用します。