【问题标题】:Parse filter expression using RegEx使用 RegEx 解析过滤器表达式
【发布时间】:2009-02-05 02:37:59
【问题描述】:

我有一个用人类可读语言编写的查询过滤器。我需要解析它并转换为 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 轻松完成吗(我不是 regex 专家)。

【问题讨论】:

    标签: .net regex parsing


    【解决方案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);
    

    【讨论】:

    • 这很完美。您启发了我正确学习 RegEx。
    • 我的学习很大程度上归功于 Jeffrey Friedl 的“掌握正则表达式”,现在是第 3 版。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    相关资源
    最近更新 更多