Если вы используете регулярное выражение, вы получите паршивые сообщения об ошибках, и все будет значительно сложнее, если ваши требования изменятся (например, если вам придется разбирать наборы в разных квадратных скобках в разные группы).
Я рекомендую вам просто написать парсер вручную, это как 10 строк кода и не должно быть очень хрупким.Отслеживайте все, что вы делаете, открывайте скобки, закрывайте скобки, открывайте скобки и закрывайте скобки.Это похоже на оператор switch с 5 опциями (и по умолчанию), что на самом деле не так уж и плохо.
Для минимального подхода открытые парены и открытые скобки можно игнорировать, поэтому на самом деле есть только 3 случая.
Это будет минимум медведя.
// Java-like psuedocode
int valuea;
String lastValue;
tokens=new StringTokenizer(String, "[](),", true);
for(String token : tokens) {
// The token Before the ) is the second int of the pair, and the first should
// already be stored
if(token.equals(")"))
output.addResult(valuea, lastValue.toInt());
// The token before the comma is the first int of the pair
else if(token.equals(","))
valuea=lastValue.toInt();
// Just store off this token and deal with it when we hit the proper delim
else
lastValue=token;
}
Это не лучше, чем минимальное решение на основе регулярных выражений, ЗА ИСКЛЮЧЕНИЕМ, что его НАМНОГО будет легче поддерживать и улучшать.(добавьте проверку ошибок, добавьте стек для сопоставления скобок и парных скобок и проверки для неуместных запятых и другого недопустимого синтаксиса)
В качестве примера расширяемости, если вам нужно было разместить разные наборы квадратных скобокгруппируются в разные выходные наборы, тогда добавление происходит так же просто, как:
// When we close the square bracket, start a new output group.
else if(token.equals("]"))
output.startNewGroup();
И проверка на наличие паренсов так же проста, как создание стека символов и добавление каждого [или (в стек, затем, когда выполучить a] или), вытолкнуть стек и утверждать, что он соответствует.Кроме того, когда вы закончите, убедитесь, что ваш стек.size () == 0.