C# Odata-如何解析过滤器
我有一个Odata过滤器,它是字符串,看起来像:C# Odata-如何解析过滤器,c#,.net,odata,C#,.net,Odata,我有一个Odata过滤器,它是字符串,看起来像: string odataFilter = "name eq 20 and surname eq 50" 我需要完成的是从中获取以下词典: dict["name"] = "20" dict["surname"] = "50" 同样重要的是:我只想处理来自odata的“and”和“eq”关键字。没有别的了 有人知道如何解决这个问题吗?可能是通过正则表达式?我会像这样使用Regex.Split: 使用系统; 使用System.Text.Regula
string odataFilter = "name eq 20 and surname eq 50"
我需要完成的是从中获取以下词典:
dict["name"] = "20"
dict["surname"] = "50"
同样重要的是:我只想处理来自odata的“and”和“eq”关键字。没有别的了
有人知道如何解决这个问题吗?可能是通过正则表达式?我会像这样使用
Regex.Split
:
使用系统;
使用System.Text.RegularExpressions;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
var dic=findAllAndEqFilter(“姓名eq 20,姓氏eq 50”);
Console.WriteLine(“测试1\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“姓名eq 21或姓氏eq 51”);
Console.WriteLine(“\r\n测试2\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称等式22”);
Console.WriteLine(“\r\n测试3\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称lt 22”);
Console.WriteLine(“\r\n测试4\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
}
公共静态字典findalandeqfilter(字符串odataFilter)
{
字典ret=新字典();
字符串[]byAnd=Regex.Split(odataFilter,“(and)”);
字符串键=”;
foreach(var和byAnd中的拆分)
如果(!Regex.IsMatch(andSplit,“(and)”)//删除和
{
字符串[]byEq=Regex.Split(和Split,“(eq)”);
foreach(byEq中的var eqSplit)
如果(!Regex.IsMatch(eqSplit,“\\s”)//如果没有空间,我们可以假设得到一个eq
如果(键==“”)
键=eqSplit;
其他的
{
ret.Add(键,eqSplit);
key=“”;
}
}
返回ret;
}
}
我会像这样使用Regex.Split
:
使用系统;
使用System.Text.RegularExpressions;
使用System.Collections.Generic;
公共课程
{
公共静态void Main()
{
var dic=findAllAndEqFilter(“姓名eq 20,姓氏eq 50”);
Console.WriteLine(“测试1\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“姓名eq 21或姓氏eq 51”);
Console.WriteLine(“\r\n测试2\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称等式22”);
Console.WriteLine(“\r\n测试3\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
dic=FindalandeQfilter(“名称lt 22”);
Console.WriteLine(“\r\n测试4\r\n”);
foreach(dic中的var kpv)
控制台写入线(kpv.Key+“->”+kpv.Value);
}
公共静态字典findalandeqfilter(字符串odataFilter)
{
字典ret=新字典();
字符串[]byAnd=Regex.Split(odataFilter,“(and)”);
字符串键=”;
foreach(var和byAnd中的拆分)
如果(!Regex.IsMatch(andSplit,“(and)”)//删除和
{
字符串[]byEq=Regex.Split(和Split,“(eq)”);
foreach(byEq中的var eqSplit)
如果(!Regex.IsMatch(eqSplit,“\\s”)//如果没有空间,我们可以假设得到一个eq
如果(键==“”)
键=eqSplit;
其他的
{
ret.Add(键,eqSplit);
key=“”;
}
}
返回ret;
}
}
几个小时后,我创建了一个非常适合我需要的正则表达式。它只接受撇号(')之间的字符串形式的文本值。此外,您可以在不使用它们的情况下传递数值
示例:命名eq‘John’和年龄eq 75
正则表达式中的结果是分组的,因此很容易从matches集合中获取它们
"(?<PropertyName>\w+?)\s+(?<Operator>eq)\s+(?<Value>(['])(\\?.)*?\1|\d+(\.\d+)?(\s*|$))(?:\s*$|\s+(?:and)(\s+|$))"
“(?\w+)\s+(?eq)\s+(?(['))(\\?)*?\1\\\d+(\.\d+)(\s*)(?:\s*$)\s+(?:和)(\s+)”
几个小时后,我创建了一个非常适合我需要的正则表达式。它只接受撇号(')之间的字符串形式的文本值。此外,您可以在不使用它们的情况下传递数值
示例:命名eq‘John’和年龄eq 75
正则表达式中的结果是分组的,因此很容易从matches集合中获取它们
"(?<PropertyName>\w+?)\s+(?<Operator>eq)\s+(?<Value>(['])(\\?.)*?\1|\d+(\.\d+)?(\s*|$))(?:\s*$|\s+(?:and)(\s+|$))"
“(?\w+)\s+(?eq)\s+(?(['))(\\?)*?\1\\\d+(\.\d+)(\s*)(?:\s*$)\s+(?:和)(\s+)”
效果很好;)工作得很好;)很好的正则表达式!很好的正则表达式!