Язык, который вы пытаетесь определить с помощью своего регулярного выражения, к сожалению, пахнет нерегулярно, то есть регулярные выражения не подходят для этого типа выражений.(Точнее, «хорошо сбалансированные круглые скобки» - это не то, что вы можете определить с помощью регулярных выражений.)
Если вы просто хотите найти подстроку a * b
в вашем примере, следующие выражения должны сделать:
Pattern p = Pattern.compile("\\(([^()]*)\\)");
Matcher m = p.matcher("(((a * b) * ) + c) * d)");
if (m.find())
System.out.println(m.group(1)); // prints "a * b"