RegEx for LINQ like语法

时间:2010-06-22 12:33:15

标签: c# regex linq

我的格式为字符串:

MyList.Where(abc).GroupBy(def).Sum(ghi)

The Where& GroupBy部分是可选的,因为函数的参数是,所以。

ThisList.Count

也有效。

我正在尝试找到一个与此匹配的RegEx字符串并返回值:
列表名称(例如MyList),where条件(例如abc),GroupBy属性(例如def),函数名称(例如Sum)和函数属性(例如ghi)。

澄清:
列表名称是一个字
abc可以是一个复杂的表达式,但是没有不在引号中的小括号
def将是一个单词
ghi将是单个单词或由“,”

分隔的单词列表

4 个答案:

答案 0 :(得分:2)

(?<list>\w+)\s*
([.]\s*Where\s*[(]\s*(?<wherearg>.*?)\s*[)]\s*)?
([.]\s*GroupBy\s*[(]\s*(?<groupbyarg>.*?)\s*[)]\s*)?
[.]\s*(?<func>\w+)\s*[(]\s*(?<funcarg>.*?)\s*[)]

答案 1 :(得分:1)

您可以使用正则表达式来验证语法,例如:

^[A-Za-z]+(\.[A-Za-z]+\([A-Za-z]+\))*(\.[A-Za-z]+)?

但这会导致有效无效决定。

我不确定你是否真的想要同时grep方法名称和值。这将限制您的语法:例如,所有方法(GroupBy,Where)必须按正确的顺序排列。也许更容易将字符串分割为.并逐个提取所需的部分。

答案 2 :(得分:1)

假设where / groupby / function参数是单词,您可以使用:

^(\w+)(?:\.Where\((\w+)\))?(?:\.GroupBy\((\w+)\))?\.(\w+)(?:\((\w+)\))?$
  • 第1组将具有列表名称
  • 第2组将具有where条件或null
  • 第3组将具有条件或null
  • 第4组将具有该功能
  • 第5组将具有函数参数或null

如果它们是复杂的C#表达式,那么相应的正则表达式会非常复杂,明天你会讨厌选择正则表达式。

答案 3 :(得分:0)

这为您提供了预期的结果。

^(?<List>[^\.]\*)|\.(?<Op>[^\(\.]*)\(*(?<Param>[^\)\.]*)