Решение 1
Хорошо, я думаю, что вы можете сделать это в два шага, заменить все ненужные символы, например, пробелом, а затем разделить их пробелом, ваше регулярное выражение может выглядеть так:
[)(*+/^!@#%&,]|\\b-\\b
Ваш код:
String[] tokens = function.replaceAll("[)(*+/^!@#%&,]|\\b-\\b", " ").split("\\s+");
Обратите внимание, что я использовал \\b-\\b
для замены только -
:
Решение 2
Или Если вы хотите что-то чистое Вы можете использовать Pattern с Matcher следующим образом:
Pattern.compile("\\b\\w+->\\w+\\b|\\b\\w+\\b")
.matcher("round((TOTAL_QTY * 100) / SUM(ORDER_ITEMS->TOTAL_QTY) , 1)")
.results()
.map(MatchResult::group)
.forEach(s -> System.out.println(String.format("\"%s\"", s)));
regex demo
Details
\b\w+->\w+\b
для соответствия этому особому случаю ORDER_ITEMS->TOTAL_QTY
|
или \b\w+\b
любому другому слову с границами слова
Обратите внимание, это решение работает из Java9 +, но вы можете использовать простое решение Pattern and Matcher.
Выходы
"round"
"TOTAL_QTY"
"100"
"SUM"
"ORDER_ITEMS->TOTAL_QTY"
"1"