2009-02-05 67 views
0

我有用人類可讀語言編寫的查詢過濾器。我需要解析它並轉換爲SQL where子句。實例是:使用RegEx解析過濾表達式

CustomerName Starts With 'J' 

變得

CustomerName LIKE 'J%' 

CustomerName Includes 'Smi' 

變得

CustomerName LIKE '%Smi%' 

完整表達要分析可能是複雜得多如

CustomerName Starts With 'J' AND State = 'CA' 

應該成爲

CustomerName LIKE 'J%' AND State = 'CA' 

什麼是去了解這一點的最好方法是什麼?可以用RegEx輕鬆完成(我不是正則表達式專家)。

回答

1

在沒有其他答案,我會在我的2美分夾頭:

在我看來,你實際上是創建一個新的語言,儘管是一個非常類似於現有的一個。所以我懷疑計算機語言解釋領域有很多技術可以使這個任務變得更簡單。

另一件要小心的是意外(或有意)的SQL注入問題。

我還沒有解決這樣的任務,但如果我正在接近使用正則表達式我會試圖爲每個新的語法有一個單獨的方法,然後將該輸入傳遞給每個方法。例如,這裏是我如何處理'Start With'語法。

public void Main() 
    { 
     string input = @"CustomerName Starts With 'J' AND State = 'CA'"; 

     ReplaceStartsWith(ref input); 
     //... 
     //ReplaceIncludes(ref input); 

     Console.WriteLine(input); 
     //Returns: CustomerName LIKE 'J%' AND State = 'CA' 
    } 

    void ReplaceStartsWith(ref string input) 
    { 
     input = startsWithRegex.Replace(input, match => 
      string.Format("LIKE '{0}%'", match.Groups["literal"])); 
    } 

      

    static RegexOptions commonOptions = 
     RegexOptions.Compiled | 
     RegexOptions.ExplicitCapture | 
     RegexOptions.IgnoreCase | 
     RegexOptions.IgnorePatternWhitespace | 
     RegexOptions.Singleline; 

      

    static Regex startsWithRegex = new Regex(
     @"\bstarts\s+with\s+'(?<literal>[^']*)'" 
     , commonOptions); 
+0

這工作完美。你激勵我正確學習RegEx。 – Craig 2009-02-06 03:15:51