C# 正则表达式匹配Certian表的复杂Where子句

C# 正则表达式匹配Certian表的复杂Where子句,c#,sql,regex,where-clause,C#,Sql,Regex,Where Clause,我有一个程序,它接受受限制的SQL Server WHERE子句,并删除针对certian表的sectiona。where子句的一个例子是 和(Util.Source='IP%'和Util.ReqType='IP')和(Util.Epinum为null)和([eposion].[YN]='Y') 我需要去掉查询中使用表的所有部分,并考虑(,),将语句和字段名的方括号等括起来 private string BuildResourceWhereClauses(string whereClauses,

我有一个程序,它接受受限制的SQL Server WHERE子句,并删除针对certian表的sectiona。where子句的一个例子是

和(Util.Source='IP%'和Util.ReqType='IP')和(Util.Epinum为null)和([eposion].[YN]='Y')

我需要去掉查询中使用表
的所有部分,并考虑
,将语句和字段名的方括号等括起来

private string BuildResourceWhereClauses(string whereClauses, string episodeTable)
{
    Regex r = new Regex(
        $"AND\\s+\\(*\\[*{episodeTable}\\]*\\.\\[*\\w+\\]*\\s*(=|<>|<=|>=)(\\s*\\'*(NULL|\\S+|\\((.*?)\\)+)\\'*\\s*\\)*){{1}}",
        RegexOptions.IgnoreCase);

    string tmp = r.Replace(whereClauses, String.Empty).Trim();
    return $" {tmp}";
}
tmp
作为

和(Util.Source='IP%'和Util.ReqType='IP')和(Util.Epinum为null)和(Util.Source='IP%'和Util.ReqType='IP')和(Util.Epinum为null)

剥离所有
插曲
子句,包括
介于
语句和
之间的
不为空
为空
语句

是有

AND\s+\(*\[*Episode\]*\.\[*\w+\]*\s*(<>|[><]?=|(?:NOT\s+)?IN|(?:IS\s+)?LIKE|(?:IS\s+NOT\s+)?LIKE|BETWEEN(\s*\'*(\((.*?)\)+|NULL|\S+)\'*\s*\)*)AND)(\s*\'*(\((.*?)\)+|NULL|\S+)\'*\s*\)*)

和\s+\(*\[*插曲\]*\.\[*\w+\]*\s*(|[>似乎您可以通过以下方式扩展您的模式:

$@"AND\s+\(*\[*{episodeTable}\]*\.\[*\w+\]*\s*(<>|[><]?=|(?:NOT\s+)?IN)(\s*\'*(\((.*?)\)+|NULL|\S+)\'*\s*\)*)"

$@”和\s+\(*\[*{eposodetable}\]*\.\[*\w+\]*\s*(|[>
正则表达式有什么问题?
您正在使用正则表达式修改SQL,这是一个可怕的黑客行为。为什么您不能只修改SQL?SQL来自用户输入。在一个CTE查询中使用where子句创建一个tmp表,该表随后与另一个tmp表连接。我需要去掉t的
部分在随后的连接查询中使用where子句。与所有类似的事情一样,我使用此方法的原因并不总是很清楚。我在这里使用正则表达式,因为它似乎是一种方便的方法,可以在不编写完整解析器的情况下做我想做的事情-这将需要更多的工作。请尝试@WiktorStribiżew我喜欢它,请简单回答,我会的接受。我认为这可能会在将来帮助其他人。贴上解释。后面很痛,但我忘记了像
和[eposion]。[Source]像“%6”
,[eposion]。[Source]不像“%6”
。另外,在第3组中,我们可能有
非空的
你能就我的更新
和\s+\(*\[*eposion\]*\)提出建议吗\[*\w+\]*\s*(|[>
AND\s+\(*\[*Episode\]*\.\[*\w+\]*\s*(<>|[><]?=|(?:NOT\s+)?IN|(?:IS\s+)?LIKE|(?:IS\s+NOT\s+)?LIKE|BETWEEN(\s*\'*(\((.*?)\)+|NULL|\S+)\'*\s*\)*)AND)(\s*\'*(\((.*?)\)+|NULL|\S+)\'*\s*\)*)
$@"AND\s+\(*\[*{episodeTable}\]*\.\[*\w+\]*\s*(<>|[><]?=|(?:NOT\s+)?IN)(\s*\'*(\((.*?)\)+|NULL|\S+)\'*\s*\)*)"