После просмотра проблема в том, что регулярное выражение совпадает только один раз.
Ваше регулярное выражение ищет элемент {"tag"} {text {} {text_here}
Это происходит только один раз при вводе:
element {"item"} {text { } {$i/child::itemno}
Ничего другого не соответствует:
text { } element {"high_bid"} { => NO MATCH, text without element before it
element {"high_bid"} {{max($b/child::bid)}} text { } => NO MATCH, text after braces
Значит, либо ваш ввод неверен, либо вам нужно что-то лучше, чем регулярное выражение.
При этом я не думаю, что здесь будет работать регулярное выражение. Вы можете удалить все элементы "text {}", которые, похоже, ничего не делают:
text.replaceAll("text\\s*\\{\\s*}", ""));
Что дает вам:
element {"item"} { {$i/child::itemno} {$i/child::description} element {"high_bid"} {{max($b/child::bid)}} }
Но проблема здесь в том, что у вас есть вложение. Если вы просто сопоставляете фигурные скобки, как вы узнаете, как далеко нужно сопоставить? Вам нужно ваше регулярное выражение, чтобы понять, сколько у вас открывающих скобок, и найти правильную закрывающую скобку. Это не совсем выполнимо с регулярными выражениями. Вам нужна функция, которая анализирует строку, считая открывающие скобки и вычитая закрывающие скобки. Когда вы получаете счетчик нуля, вы нашли множество ... Конечно, это не регулярные выражения.