使用RegEx解析过滤器表达式

时间:2009-02-05 02:37:59

标签: .net regex parsing

我有一个用人类可读语言编写的查询过滤器。我需要解析它并转换为SQL where子句。例如:

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 个答案:

答案 0 :(得分:1)

在没有其他答案的情况下,我会以2美分的价格购买:

在我看来,你实际上是在创造一种新语言,尽管它与现有语言非常相似。所以我怀疑计算机语言解释领域有许多技术可以使这个任务变得更简单。

另一件要谨慎的事情是意外(或故意)SQL注入问题。

我没有解决过这样的任务,但是如果我使用Regex接近这个,我会想要为每个新语法设置一个单独的方法,然后将该输入传递给每个方法。例如,这是我如何处理'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);