RegEx для LINQ, как синтаксис - PullRequest
0 голосов
/ 22 июня 2010

У меня есть строка в формате:

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

Части Where & GroupBy являются необязательными, так как это аргумент функции, поэтому.

ThisList.Count

isтакже допустимо.

Я пытаюсь найти строку RegEx, которая будет соответствовать этому, и вернуть значения:
Имя списка (например, MyList), условие where (например, abc), атрибут GroupBy (например, def), имя функции (например, Sum) и атрибут функции (например, ghi).

Уточнение:
Имя списка состоит из одного слова
abc может бытьсложное выражение, но не будет закрывающих скобок, которые не заключены в кавычки
def будет одним словом
ghi будет одним словом или списком слов, разделенных ","

Ответы [ 4 ]

2 голосов
/ 22 июня 2010
(?<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 голос
/ 22 июня 2010

Предполагая, что параметры / groupby / function являются словами, вы можете использовать:

^(\w+)(?:\.Where\((\w+)\))?(?:\.GroupBy\((\w+)\))?\.(\w+)(?:\((\w+)\))?$
  • Группа 1 будет иметь имя списка
  • Группа 2 будет иметь условие гдеили ноль
  • Группа 3 будет иметь группу по условию, или ноль
  • Группа 4 будет иметь функцию
  • Группа 5 будет иметь параметр функции или нуль

Если они будут сложными выражениями на C #, соответствующее регулярное выражение будет довольно сложным, поэтому завтра вы возненавидите себя за выбор регулярного выражения для этого.

1 голос
/ 22 июня 2010

Вы можете использовать регулярное выражение для проверки синтаксиса, например:

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

, но это приведет к действительному или неверному решению.

Я не уверен, действительно ли вы хотите использовать grep для имен и значений методов одновременно.Это ограничит ваш синтаксис: например, все методы (GroupBy, Где) должны быть в правильном порядке.Возможно, проще разбить строку на . и извлечь нужные вам части одну за другой.

0 голосов
/ 22 июня 2010

Это дает ожидаемый результат.

^(?<List>[^\.]\*)|\.(?<Op>[^\(\.]*)\(*(?<Param>[^\)\.]*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...