gpt4 book ai didi

c# - 动态 If 语句 - 复杂过滤

转载 作者:行者123 更新时间:2023-11-30 22:29:03 25 4
gpt4 key购买 nike

我有一个 C# 项目,允许用户使用正则表达式对数据创建过滤器。他们可以根据需要添加任意数量的过滤器。每个过滤器都包含一个字段和一个用户输入的正则表达式。

现在它适用于所有 AND 逻辑。我遍历每个过滤器,如果不匹配,我设置 skip = true 并跳出循环。然后,如果 skip == true 我跳过该记录并且不包含它。因此,每个过滤器都必须匹配才能包含该字段。

但是,现在他们希望能够添加更复杂的逻辑规则。因此,例如,如果他们创建了 4 个过滤规则。他们希望能够指定:1 和 2 和(3 或 4)或者他们可能想指定1 或 2 或 3 或 4或者他们可能想指定(1 和 2 和 3) 或 4等等......我想你明白了。

我添加了一个文本框,他们可以在其中输入他们想要的逻辑。

我一直在绞尽脑汁,但我对如何使这项工作感到困惑。我唯一的结论是以某种方式能够创建基于他们在文本框中键入的文本的动态 IF 语句,但我不知道这是否可能。

似乎应该有一个简单的方法来做到这一点,但我想不出来。如果有人能帮助我,我将不胜感激。

谢谢!

最佳答案

这是一个完整的测试,可以根据您的需要使用正则表达式以及 AND、OR 和括号。请注意,这仅支持运算符 ANDOR 以及圆括号 () 并且期望输入有点格式正确(正则表达式不能有空格)。解析可以改进,思路保持不变。

这是整体测试:

var input = ".* AND [0-9]+ AND abc OR (abc AND def)";
var rpn = ParseRPN(input);
var test = GetExpression(new Queue<string>(rpn.Reverse())).Compile();
test("abc"); // false
test("abc0"); // true
test("abcdef"); // true

这里是反向波兰符号的解析:

public Queue<string> ParseRPN(string input)
{
// improve the parsing into tokens here
var output = new Queue<string>();
var ops = new Stack<string>();
input = input.Replace("(","( ").Replace(")"," )");
var split = input.Split(' ');

foreach (var token in split)
{
if (token == "AND" || token == "OR")
{
while (ops.Count > 0 && (ops.Peek() == "AND" || ops.Peek() == "OR"))
{
output.Enqueue(ops.Pop());
}
ops.Push(token);
}
else if (token == "(") ops.Push(token);
else if (token == ")")
{
while (ops.Count > 0 && ops.Peek() != "(")
{
output.Enqueue(ops.Pop());
}
ops.Pop();
}
else output.Enqueue(token); // it's a number
}

while (ops.Count > 0)
{
output.Enqueue(ops.Pop());
}

return output;
}

还有神奇的GetExpression:

public Expression<Func<string,bool>> GetExpression(Queue<string> input)
{
var exp = input.Dequeue();
if (exp == "AND") return GetExpression(input).And(GetExpression(input));
else if (exp == "OR") return GetExpression(input).Or(GetExpression(input));
else return (test => Regex.IsMatch(test, exp));
}

注意这确实依赖于 PredicateBuilder ,但所使用的扩展功能在这里是完整的:

public static class PredicateBuilder
{
public static Expression<Func<T, bool>> True<T> () { return f => true; }
public static Expression<Func<T, bool>> False<T> () { return f => false; }

public static Expression<Func<T, bool>> Or<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.OrElse (expr1.Body, invokedExpr), expr1.Parameters);
}

public static Expression<Func<T, bool>> And<T> (this Expression<Func<T, bool>> expr1,
Expression<Func<T, bool>> expr2)
{
var invokedExpr = Expression.Invoke (expr2, expr1.Parameters.Cast<Expression> ());
return Expression.Lambda<Func<T, bool>>
(Expression.AndAlso (expr1.Body, invokedExpr), expr1.Parameters);
}
}

关于c# - 动态 If 语句 - 复杂过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10392458/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com