我正在实施过滤器。
我将过滤条件存储在字符串列表中。例如 列出过滤器
过滤逻辑作为字符串,例如
String filterLogic = "(1 AND 2) OR 3";
现在我想用过滤条件替换数字,例如
(过滤器[1]和过滤器[2])或过滤器[3])
//stores all the filter criterias
List<String> filters = new List<string>();
for (int i = 1; i <= controlGroupId;i++ )
{
StringBuilder sb = new StringBuilder();
String fieldsDropdownId="dlFields"+i;
DropDownList dlFields = (DropDownList)this.FindControl(fieldsDropdownId);
sb.Append(dlFields.SelectedValue);
String operatorDropdownId = "dlOperator" + i;
DropDownList dlOperator = (DropDownList)this.FindControl(operatorDropdownId);
String operatorValue = dlOperator.SelectedValue;
String valuetxbId = "txb" + i;
TextBox tb = (TextBox)this.FindControl(valuetxbId);
String textboxValue = tb.Text;
switch (operatorValue)
{
case "=":
sb.Append("=");
sb.Append(textboxValue);
break;
case "<>":
sb.Append("<>");
sb.Append(textboxValue);
break;
case "<":
sb.Append("<");
sb.Append(textboxValue);
break;
case ">":
sb.Append(">");
sb.Append(textboxValue);
break;
case ">=":
sb.Append(">=");
sb.Append(textboxValue);
break;
case "<=":
sb.Append("<=");
sb.Append(textboxValue);
break;
case "contains":
sb.Append(" Like ");
sb.Append("'%");
sb.Append(textboxValue);
sb.Append("%'");
break;
case "does not contain":
sb.Append(" Not Like ");
sb.Append("'%");
sb.Append(textboxValue);
sb.Append("%'");
break;
case "starts with":
sb.Append(" Like ");
sb.Append("'");
sb.Append(textboxValue);
sb.Append("%'");
break;
}
filters.Add(sb.ToString());
}
更新
List<String> l = new List<string>();
for (int i = 1; i < 12; i++)
{
String s="hello"+i;
l.Add(s);
}
String ss = "(1 AND 2 AND 3 AND 4 AND 5 AND 6 AND 7 AND 8 AND 9 AND 10 AND 11)";
Regex rgx = new Regex(@"\d+");
ss=rgx.Replace(ss, "l[$0]");
这给了我: “(l [1] AND l [2] AND l [3] AND l [4] AND l [5] AND l [6] AND l [7] AND l [8] AND l [9] AND l [10 ]和l [11])“
我想要的是: (hello1 AND hello2 AND hello3 AND hello4 AND hello5 AND hello6 AND hello7 AND hello8 AND hello9 AND hello10 AND hello11)“;
答案 0 :(得分:1)
鉴于所有整数都是索引,可以执行以下操作:
Regex rgx = new Regex (@"\d+");
rgx.Replace(fitlerLogic, "filters[$0]");
然后结果是:
"filters[1] AND filters[2]) OR filters[3]"
但如果所有整数都应该用filter
索引替换,则仅有效。
你也是一个错字的方式:它是filterLogic
,而不是fitlerLogic
。
编辑:或者如果您想用实际值替换它,可以使用 lambda-expression :
object[] filter = new object[] {false,true,false,true};//not that an array is 0-indexed
Regex rgx = new Regex (@"\d+");
rgx.Replace (fitlerLogic,x => filter[int.Parse(x.Value)].ToString());
在这种情况下,结果是:
"(True AND False) OR True"
如果您希望评估表达式,我会查看编译器编译器和无上下文语法。