Вы не можете сделать это с помощью механизма регулярных выражений Java, поскольку это допустимый ввод:
<math>
<apply>
<plus/>
<apply>
<times/>
<ci>a</ci>
<apply>
<power/>
<ci>x</ci>
<cn>2</cn>
</apply>
</apply>
<apply>
<times/>
<ci>b</ci>
<ci>x</ci>
</apply>
<ci>c</ci>
</apply>
</math>
Т.е.: могут быть произвольные вложенные теги, а движок регулярных выражений Java не имеет возможности сопоставлять рекурсивные шаблоны. Вам придется прибегнуть к некоторому парсеру для обработки ввода MathML.
EDIT
Могу ли я считать все это строкой и найти шаблон, который соответствует? Это то, что я пытаюсь. И не будет никаких рекурсивных тегов внутри другого тега. они будут на одном уровне.
В этом случае попробуйте этот шаблон:
<math[>\s](?s).*?</math>
или как строковый литерал:
"<math[>\\s](?s).*?</math>"
, что означает:
<math[>\s] # match `<math` followed by a space or `>`
(?s).*? # reluctantly match zero or more chars (`(?s)` causes `\r`
# and `\n` also to be matched)
</math> # match `</math>`