I have a C# project that allows users to create filters on data using Regular Expressions. They can add as many filters as they want. Each filter consists of a Field and a regular expression that the user types in.
Right now it works with all AND logic. I loop through each filter and if it doesn’t match I set skip = true and break out of the loop. Then if skip == true I skip that record and don’t include it. So each and every filter must match in order for the field to be included.
However, now they want the ability to add more complex logic rules. So for example if they have created 4 filter rules. They want to be able to specify:
1 AND 2 AND (3 OR 4)
or they may want to specify
1 OR 2 OR 3 OR 4
or they may want to specify
(1 AND 2 AND 3) OR 4
and so on…I think you get the point.
I have added a textbox where they can type in the logic that they want.
I have been racking my brain and I am stumped on how to make this work. My only conclusion is to somehow be able to create a dynamic IF statement that is based on the text they type into the textbox but I don’t know if that is even possible.
It seems like there should be an easy way to do this but I can’t figure it out. If anyone could help me, I would really appreciate it.
Thanks!
Here’s a full test that works as you want it with regular expressions and AND, OR and brackets. Note that this only supports the operators
ANDandORand parentheses(and)and expects the input to be somewhat well formed (regular expressions must not have spaces). The parsing can be improved, the idea remains the same.Here is the overall test:
Here is the parsing to reverse polish notation:
And the magic
GetExpression:Note this does rely on
PredicateBuilder, but the extension functions used are here in there completeness: