使用RegEx解析过滤表达式
问题描述:
我有用人类可读语言编写的查询过滤器。我需要解析它并转换为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轻松完成(我不是正则表达式专家)。
答
在没有其他答案,我会在我的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。 – Craig 2009-02-06 03:15:51