Как я могу указать приоритет шаблона соответствия в регулярном выражении?

Я пишу механизм анализа функций, который использует регулярные выражения для разделения отдельных терминов (определенных как константа или переменная, за которыми (необязательно) следует оператор). Он отлично работает, за исключением случаев, когда я сгруппировал термины в другие сгруппированные термины. Вот код I ' m с использованием:

//This matches an opening delimiter
Regex openers = new Regex("[\\[\\{\\(]");

//This matches a closing delimiter
Regex closers = new Regex("[\\]\\}\\)]");

//This matches the name of a variable (\w+) or a constant numeric value (\d+(\.\d+)?)
Regex VariableOrConstant = new Regex("((\\d+(\\.\\d+)?)|\\w+)" + FunctionTerm.opRegex + "?");

//This matches the binary operators +, *, -, or /
Regex ops = new Regex("[\\*\\+\\-/]");

//This compound Regex finds a single variable or constant term (including a proceeding operator,
//if any) OR a group containing multiple terms (and their proceeding operators, if any)
//and a proceeding operator, if any.
//Matches that match this second pattern need to be added to the function as sub-functions,
//not as individual terms, to ensure the correct evalutation order with parentheses.
Regex splitter = new Regex(
openers + 
"(" + VariableOrConstant + ")+" + closers + ops + "?" +
"|" +
"(" + VariableOrConstant + ")" + ops + "?");

Когда «splitter» сопоставляется со строкой «4 / (2 * X * [2 + 1])», значения совпадений: «4 /», «2 *», «X *» , «2+» и «1», полностью игнорируя все ограничивающие скобки и фигурные скобки. Я считаю, что это связано с тем, что вторая половина регулярного выражения «разделитель» (часть после «|») соответствует и перекрывает другую часть шаблона. Это плохо - я хочу, чтобы сгруппированные выражения имели приоритет над отдельными терминами. Кто-нибудь знает, как я могу это сделать? Я изучал использование положительных / отрицательных просмотров вперед и назад, но я, честно говоря, не уверен, как их использовать или для чего они вообще нужны, в этом отношении, и я не могу найти никаких подходящих примеров ... Заранее спасибо .

8
задан Michael Hoffmann 13 December 2010 в 01:32
поделиться