2010-06-22 88 views
0

我有格式的字符串:正則表達式LINQ的語法

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

在哪裏&的GroupBy部分是可選的,因爲是函數參數,所以。

ThisList.Count 

也是有效的。

我試圖找到一個正則表達式的字符串,將匹配這一點,並返回值:
列表名稱(例如MYLIST),WHERE條件(例如ABC),該屬性的GroupBy(例如DEF),該函數名稱(例如Sum)和函數屬性(例如ghi)。

澄清:
列表名稱就是一個字
ABC可以是一個複雜的表達式,但不會有接近括號其不在引號
高清將是一個字
GHI會是單個單詞或分隔的單詞列表「」

+0

abc,def和ghi部分有多複雜?你說「LINQ like」,但這實際上是C#代碼嗎?例如,這可能嗎? 'MyList.Where(p => p.Value> MyOtherList.Where(i => i.Age <40).Count)' – 2010-06-22 13:21:04

+0

Nope,那裏將會列出一些布爾從句,它們之間有&& 我的列表。其中(ARG1 =「你好」 && ARG2 = 23) 我不排除,一個右括號,都可能偷偷在一個字符串雖然,例如MyList.Where(ARG1 = 'd(O)H') – 2010-06-22 13:36:29

回答

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*[)]
+0

尼斯!我怎麼會做出函數參數括號可選? 例如 List.Count應該工作以及List.Count() – 2010-06-22 13:45:14

+0

更改最後一行是這樣的:[。]'\ S *(? \ w +)\ S *([(] \ S *(* ?。? )\ S * [)])?' – 2010-06-22 14:04:25

1

您可以使用正則表達式來驗證語法,如:

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

但這會導致有效無效決定。

我不確定是否真的想要同時grep方法名稱和值。這會限制你的語法:例如,所有方法(GroupBy,Where)必須按照正確的順序。也許將字符串拆分爲.更容易,並逐個提取所需的部分。

1

假設其中/ GROUPBY /函數的參數是的話,你可以使用:

^(\w+)(?:\.Where\((\w+)\))?(?:\.GroupBy\((\w+)\))?\.(\w+)(?:\((\w+)\))?$ 
  • 組1將列表名稱
  • 組2將有where條件或空
  • 第3組將根據條件或零組來分組012具有功能
  • 組4將具有功能
  • 組5將具有功能參數ter或null

如果他們要成爲複雜的C#表達式,那麼相應的正則表達式將非常複雜,您明天會爲自己選擇正則表達式而討厭自己。

0

這給你預期的結果。

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