Regex для извлечения имени функции и ее параметров - PullRequest
4 голосов
/ 07 октября 2011

Я создаю приложение, в котором пользователь может указать выражение для некоторых полей. Выражение также должно содержать функции. Мне нужно оценить эти выражения и отобразить окончательное значение в отчете.

У меня было выражение для извлечения имени функции и ее параметров. Ранее параметры функции были десятичными значениями. Но теперь параметры также могут быть выражением.

Например,

Round( 1  * (1+  1 /100) % (2 -1), 0)

Function-name : Round
Parameter1    : 1  * (1+  1 /100) % (2 -1)
Parameter2    : 0

Предыдущее регулярное выражение:

string pattern2 = @"([a-zA-Z]{1,})[[:blank:]]{0,}\(([^\(\)]{0,})\)";

Это регулярное выражение больше не помогает мне находить параметры выражения.

Может ли кто-нибудь помочь мне с правильным регулярным выражением для извлечения имени функции и параметров? Я реализую все или большинство функций, поддерживаемых классом Math. Программа встроена в c #

Заранее спасибо за помощь.

Ответы [ 3 ]

2 голосов
/ 07 октября 2011
 "^\s*(\w+)\s*\((.*)\)"

группа (1) является именем функции

разделить группу (2) с помощью "," вы получите список параметров.

обновлен

, поскольку у меня нет системы Windows (также .Net), я тестирую ее с помощью python. Вложенная функция не является проблемой. если мы добавим «^ \ s *» в начале выражения:

import re

s="Round(floor(1300 + 0.234 - 1.765), 1)"
m=re.match("^\s*(\w+)\s*\((.*)\)",s)
m.group(1)
Output: 'Round'

m.group(2)
Output: 'floor(1300 + 0.234 - 1.765), 1'
you can split if you like:
m.group(2).split(',')[0]
Out: 'floor(1300 + 0.234 - 1.765)'

m.group(2).split(',')[1]                                                                                                        
Out: ' 1'

хорошо, если ваша вложенность функций похожа на f(a(b,c(x,y)),foo, m(j,k(n,o(i,u))) ), мой код не будет работать.

1 голос
/ 07 октября 2011

Вы можете попробовать написать синтаксический анализатор вместо использования регулярных выражений.
Библиотека Irony (на мой взгляд) чрезвычайно проста в использовании, и в примерах есть нечто очень похожее на то, что вы пытаетесь сделать.

0 голосов
/ 06 марта 2017

Из сообщения Regex для сопоставления функций и захвата их аргументов , вы можете извлечь свою функцию с помощью Kent regex и использовать этот код для извлечения параметров из последней группы:

string extractArgsRegex = @"(?:[^,()]+((?:\((?>[^()]+|\((?<open>)|\)(?<-open>))*\)))*)+";
var ArgsList = Regex.Matches(m.Groups[m.Groups.Count - 1].Value, extractArgsRegex);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...