I'm trying to use Matcher and Formatter to extract each parenthetical from a mathematical expression, store it in a Stack, and replace it with '@' in the original expression. For example,
parentheses("4*(5+2)/(7^6/(9+x*5))")
should render
["4*@/@", "5+2", "7^6/@", "9+x*5"]
Here is the relevant code:
private static final Pattern p = Pattern.compile([a regex]);
private static Stack<String> parentheses(String expression) {
expression = expression.replaceAll("\\[\\{", "(").replaceAll("\\]\\}", ")").replaceAll("\\s", "");
Stack<String> pars = new Stack<String>();
pars.push(expression);
pars.addAll(parenthesesHelper(expression));
return pars;
}
private static Stack<String> parenthesesHelper(String expression){
Stack<String> pars = new Stack<String>();
Matcher m = p.matcher(expression);
StringBuilder sb = new StringBuilder();
Formatter f = new Formatter(sb);
while(m.find()){ //line 120
pars.push(f.format("%s", m.group()).toString());
sb.delete(0, sb.length());
pars.addAll(parenthesesHelper(pars.peek())); //line 123
}
return pars;
}
and my error output:
Exception in thread "main" java.lang.StackOverflowError
at java.util.regex.Pattern$Curly.match0(Pattern.java:3644)
at java.util.regex.Pattern$Curly.match(Pattern.java:3628)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
at java.util.regex.Pattern$Loop.match(Pattern.java:4179)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4111)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3666)
at java.util.regex.Pattern$Curly.match(Pattern.java:3628)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3314)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3673)
at java.util.regex.Pattern$Curly.match(Pattern.java:3628)
at java.util.regex.Pattern$GroupTail.match(Pattern.java:4111)
at java.util.regex.Pattern$BmpCharProperty.match(Pattern.java:3335)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3673)
at java.util.regex.Pattern$Curly.match(Pattern.java:3628)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
at java.util.regex.Pattern$Loop.matchInit(Pattern.java:4195)
at java.util.regex.Pattern$Prolog.match(Pattern.java:4135)
at java.util.regex.Pattern$CharProperty.match(Pattern.java:3314)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3673)
at java.util.regex.Pattern$Curly.match(Pattern.java:3628)
at java.util.regex.Pattern$Curly.match0(Pattern.java:3673)
at java.util.regex.Pattern$Curly.match(Pattern.java:3628)
at java.util.regex.Pattern$GroupHead.match(Pattern.java:4052)
at java.util.regex.Pattern$Start.match(Pattern.java:3024)
at java.util.regex.Matcher.search(Matcher.java:1105)
at java.util.regex.Matcher.find(Matcher.java:535)
at Equation.parenthesesHelper(Equation.java:120)
at Equation.parenthesesHelper(Equation.java:123)
[the previous line repeated several times]
I should probably convert the recursion to a while loop, but could use some help with that.
Message was edited by:
Jesdisciple