Соответствующие скобки с оператором деления - Regex - PullRequest
1 голос
/ 17 января 2011

Примеры:

input: (n!/(1+n))
output: frac{n!}{1+n}

input: ((n+11)!/(n-k)^(-1))
output: frac{(n+11)!}{(n-k)^(-1)}

input: (9/10)
output: frac{9}{10}

input: ((n+11)!/(n-k)^(-1))+(11)/(2)
output: frac{(n+11)!}{(n-k)^(-1)}+(11)/(2)

Следующее регулярное выражение работает, если нет скобок.

\(([^\/\)]*)\/([^\)]*)\)

Следующие слова соответствуют круглым скобкам

@\((([^()]++|\((?:[^()]++|(?R))+\))+)\)@

Я просто не могу понять, как их "объединить" - напишите одно регулярное выражение для обработки сбалансированных скобок и .

Ответы [ 2 ]

0 голосов
/ 18 января 2011

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

0 голосов
/ 18 января 2011

Я думаю, что-то вроде этого должно работать:

((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?)\/((?1))

Теперь, это, вероятно, не идеально, но вот идея:

Первая группа, $ 1, это ((?:\w+|\((?1)\))(?:[+*^-](?1)|!)?), что:

(A литерал ) или (сбалансированное выражение , заключенное в скобки ), затем необязательный оператор и другое сбалансированное выражение если нужно.
Таким образом, мы можем использовать (?1) в любом месте регулярного выражения для ссылки на другое сбалансированное выражение.

Рабочий пример: http://ideone.com/PNLOD

...