C#解析过滤字符串

时间:2017-03-03 02:10:10

标签: c#

我需要解析以下字符串,

var filter = "username eq \"john.smith\""

得到,

var leftPart = "username"
var operator = "eq"
var rightPart = "john.smith"

这样做的最佳方式是什么?

我需要解析像

这样的复杂查询
filter=userType eq "Employee" and emails.type eq "work"

是的,我查看了字符串拆分,正则表达式,按字符迭代。有没有图书馆来做这些事情?我正在寻找一个复杂的过滤器查询解析。我查看了Antlr,但不幸的是我无法让它工作.net core + VS2017。

3 个答案:

答案 0 :(得分:3)

  

我需要解析复杂的查询

小男孩,你有没有开过一罐虫子。

如果你很幸运,你真正需要的是令牌传递到其他地方用于实际的过滤器,在这种情况下,在Google或NuGet中搜索C#lexer或tokenizer应该会为你提供相当简单的解决方案。< / p>

如果您确实需要自己从这些令牌中实现过滤器,则需要更深入地了解。理想情况下,您使用的是某种着名的语法(即:弹性搜索过滤器或parse.com),并且您可以使用现有的解析器。但如果没有,仍然有一些工具可以帮助你。 ANTLR就是其中之一,它可以使用C# library。 .Net还对Domain Specific Languages提供了一些内置支持。

但主要的是避免自己从头开始编写这些代码。如果你真的处理复杂的查询,花时间学习这些东西,从长远来看,将为你节省大量的悲伤。

答案 1 :(得分:0)

String[] substrings = filter.Split(' ');
leftPart = substrings[0] ...

并删除“在右边部分(如上面提到的Mohit)

答案 2 :(得分:0)

你可以像这样手动完成:

var filter = "username eq \"john.smith\"";
var parts = filter.Split(" \"\\".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
var leftPart = parts[0];
var oper = parts[1];
var rightPart = parts[2];