Найти и заменить для уравнений (регулярное выражение?) - PullRequest
3 голосов
/ 02 августа 2010

Я конвертирую некоторые формулы Excel в другую систему, и мне нужно сделать довольно изящный поиск и заменить магию. Я полагаю, что Regex - это инструмент для работы в этом случае, но если у кого-то есть какие-то другие идеи, я бы хотел их услышать.

Я работаю над превращением этих формул в нечто, напоминающее синтаксис SQL. Мне также приходится иметь дело с алгебраическими символами, поэтому у меня может быть следующее:

9 ^ 2 нужно будет стать СИЛА (9,2). (A + 3) ^ 3 нужно будет стать POWER ((A + 3), 3).

Каков наилучший подход для этого?

Я использую C # 3.5, если это имеет значение.

edit: Пример чего-то, что я должен разобрать (символ питания находится в конце):

"((({VAL(9286)} / 1000) * {VAL(4648)}) + (({VAL(9609)} / 1000) + ({VAL(6480)} / 1000)) * {VAL(8574)}) / ({VAL(9286)} / 1000 + {VAL(9609)} / 1000 + {VAL(6480)} / 1000) * (({VAL(9286)} / 22.4)*34.38 + {VAL(9609)} + {VAL(6480)}) * ((1.075068 + 0.001*11.17019 * ((({VAL(9286)} / 1000) * {VAL(4648)}) + (({VAL(9609)} / 1000) + ({VAL(6480)} / 1000)) * {VAL(8574)}) / ({VAL(9286)} / 1000 + {VAL(9609)} / 1000 + {VAL(6480)} / 1000)+273.15)) + (100000*0.90755 / ((({VAL(9286)} / 1000) * {VAL(4648)}) + (({VAL(9609)} / 1000) + ({VAL(6480)} / 1000)) * {VAL(8574)}) / ({VAL(9286)} / 1000 + {VAL(9609)} / 1000 + {VAL(6480)} / 1000) + 273.15)^2))*4.1868/32)"

1 Ответ

2 голосов
/ 02 августа 2010

Из-за возможности использования вложенных скобок регулярное выражение не подходит для этой задачи.Лучше использовать синтаксический анализатор математических выражений.

Но это не невозможно.Например, несколько раз , заменяя шаблон

((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O1>)|\)(?<-O1>))*(?(O1)(?!))\))?)\s*\^\s*((?=[\w.(])[\w.]*\s*(?:\((?>[^()]+|\((?<O2>)|\)(?<-O2>))*(?(O2)(?!))\))?)

на

"POWER($1,$2)"

, пока строка не перестанетизменить, он должен быть в состоянии превратить все a^b в POWER(a,b).Пример:

   (a+3)^(b+5^(c+3)) + 9 ^ 2 + (A + 3)^3 + (5^7)^(6^(8^9-1)-3)
-> POWER((a+3),(b+5^(c+3))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((5^7),(6^(8^9-1)-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(8^9-1))-3))
-> POWER((a+3),(b+POWER(5,(c+3)))) + POWER(9 ,2 )+ POWER((A + 3),3 )+ POWER((POWER(5,7)),(POWER(6,(POWER(8,9)-1))-3))
-> done

Обратите внимание, что это регулярное выражение будет предполагать, что ^ ассоциативно слева, а не справа.

   1^2^3
-> POWER(1,2)^3
-> POWER(POWER(1,2),3)
-> done

, хотя сам 1 ^ 2 ^ 3 не очень хорошо-formed.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...